167 - The Sultan's Successors(****)八皇后问题

/*
推荐题型:四星,没有解出。。。
带权值的八皇后问题
思路:按行进行搜索,数组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;
}


你可能感兴趣的:(c)