hdu2553解题报告

经典的dfs:N皇后,开始看了刘汝佳前辈的书..代码简单明了...就是理解起来有点....哎哎...于是就自己用dfs模板加了一个判断,还有就是这里用到打表...对于N<=10 我们可以把N从1~10的情况都dfs出来存在一个数组,后面就直接取用,如果对于每一次输入dfs就会超时....

因为是逐行填写,,那么就只要考虑下图的三个方向(红的的)

hdu2553解题报告_第1张图片

上马:

#include<stdio.h>
#include<string.h>

int N;
int ans;
int map[14][14];

int vis[3][2]={{-1,1},{-1,0},{-1,-1}};//这里是判断要用到的,对于这个位置的左右对角,和这一列看有没有填写过

bool judg(int x,int y)
{
	for(int i=0;i<3;i++)//因为这里是逐行填写,就不用考虑这一行有没有出现,只要考虑三个方向
	{
		int a=x+vis[i][0],b=y+vis[i][1];
		while(!map[a][b])
		{
			a+=vis[i][0];b+=vis[i][1];
		}
		if(a>=0&&b>=0&&b<N)
			return false;
	}
	return true;
}

void dfs(int step)
{
	int i;
	if(step==N)
	{
		ans++;
		return;
	}

	for(i=0;i<N;i++)//这里是从0到N行是否可以填数
	{
		if(!map[step][i] && judg(step,i))//进行3个方向判断有没有填写过
		{
			map[step][i]=1;
			dfs(step+1);
			map[step][i]=0;
		}
	}
}

int main()
{
		int q[11];
		for(N=1;N<11;N++)
		{
		   memset(map,0,sizeof(map));
		   ans=0;
		   dfs(0);
		   q[N]=ans;
		}
	while(scanf("%d",&N),N)
	{
		printf("%d\n",q[N]);
	}
	return 0;
}
个人愚昧观点...欢迎指正与讨论

你可能感兴趣的:(小麻烦)