鹿我所录的博客

记录我在学习C#中的点点滴滴,记录下以备后来人借鉴。

 

洛谷P1219八皇后-题解

原题:

 

 

思路:

显然是搜索

但问题在于要同时标记行、列、对角线

对角线有规律:从左上到右下,x-y是固定值,从左下到右上,x+y是固定值

由于x-y有可能是负的,所以要+n

代码:

#include <iostream>
using namespace std;
int n,ans,book[233],djx_z[233],djx_f[233],arr[233];
void DFS(int dep)
{
	if(dep>n)
	{
		ans++;
		if(ans<=3)
		{
			for(int i=1;i<=n;i++)
				cout << arr[i] << ' ';
			cout << endl;
		}
		return;
	}
	for(int i=1;i<=n;i++)
	{
		if(book[i]==0&&djx_z[dep+i]==0&&djx_f[dep-i+n]==0)
		{
			arr[dep]=i;
			book[i]=1;
			djx_z[dep+i]=1;
			djx_f[dep-i+n]=1;
			DFS(dep+1);
			book[i]=0;
			djx_z[dep+i]=0;
			djx_f[dep-i+n]=0;
		}
	}
}
int main()
{
	cin >> n;
	DFS(1);
	cout << ans;
	return 0;
}

  

posted on 2020-08-07 10:18  鹿我所录  阅读(155)  评论(0编辑  收藏  举报

导航