/*
推荐题型:四星,没有解出。。。
带权值的八皇后问题
思路:按行进行搜索,数组p记录每行皇后所在列。
每次搜索到第八行,进行一次处理即可。
*/
#include <cstdio>
#include <cstring>
int G[10][10];
int a[10],b[10],c[20];
int p[10];
int ans;
void dfs(int cur)
{
if(cur==8)
{
int num=0;
for(int i=0;i<8;i++)
num+=G[i][p[i]];
if(num>ans)
ans=num;
}
//int ok=
for(int i=0;i<8;i++)
{
if(!a[i] && !b[cur+i] && !c[cur-i+8])
{
p[cur]=i;
a[i]=b[cur+i]=c[cur-i+8]=1;
dfs(cur+1);
a[i]=b[cur+i]=c[cur-i+8]=0;
}
}
}
int main()
{
//freopen("data.in","r",stdin);
int k;
scanf("%d",&k);
while(k--)
{
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
scanf("%d",&G[i][j]);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
ans=0;
dfs(0);
printf("%5d\n",ans);
}
return 0;
}/*
错解
*/
#include <cstdio>
#include <cstring>
const int nMax=8;
int G[nMax][nMax];
bool visit[nMax][nMax];
int a[nMax],b[nMax],c[2*nMax],d[2*nMax];
int ans;
int dir[4][2]={0,1,0,-1,1,0,-1,0};
bool check(int x,int y)
{
if(x<0 || x>=nMax || y<0 || y>=nMax)
return false;
if(visit[x][y])
return false;
if(a[x] || b[y] || c[x-y+nMax] || d[x+y])
return false;
return true;
}
void dfs(int x,int y,int sum,int n)
{
visit[x][y]=1;
if(n>nMax)
{
if(sum>ans)
ans=sum;
return;
}
a[x]=1;
b[y]=1;
c[x-y+nMax]=1;
d[x+y]=1;
for(int i=0;i<4;i++)
{
int xx,yy;
xx=x+dir[i][0];
yy=y+dir[i][1];
if(check(xx,yy))
dfs(xx,yy,sum+G[x][y],n+1);
}
a[x]=0;
b[y]=0;
c[x-y+nMax]=0;
d[x+y]=0;
for(int i=0;i<4;i++)
{
int xx,yy;
xx=x+dir[i][0];
yy=y+dir[i][1];
if(check(xx,yy))
dfs(xx,yy,sum,n);
}
visit[x][y]=0;
}
int main()
{
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
int k;
scanf("%d",&k);
while(k--)
{
memset(G,0,sizeof(G));
memset(visit,0,sizeof(visit));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
for(int i=0;i<nMax;i++)
for(int j=0;j<nMax;j++)
scanf("%d",&G[i][j]);//漏掉了地址符&
dfs(0,0,0,0);
printf("%5d\n",ans);
}
return 0;
}
167 - The Sultan's Successors(****)八皇后问题
最新推荐文章于 2018-04-01 22:24:15 发布