1. 程式人生 > >洛谷p1219八皇后問題 dfs+回溯

洛谷p1219八皇后問題 dfs+回溯

洛谷p1219八皇后問題 題目連結 程式碼如下

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int h[100],l[100],c[100],d[100];//分別代表行列左下到右上,左下到右上 
int sum,n;//sum
int print()
{
	if(sum<=2)
	{
		for(int m=1;m<=n;m++)
		printf("%d ",h[m]);
		printf("\n");
	}
	sum++;
}
void dfs(int i)//包括搜尋和回溯
{
	if(i>n)
	{
		print();
		return ;
	}
	else
	for(int j=1;j<=n;j++)
	{
		if((!l[j])&&(!c[i+j])&&(!d[i-j+n]))
		//i-j+n的原因是防止出現負值
		//相當每個孤立的點都是四個身份 
		{
			h[i]=j;//宣佈佔領
			l[j]=1;
			c[i+j]=1;
			d[i-j+n]=1;
			//接下來就該繼續往下走了,找下一個皇后 
			dfs(i+1); 
			//回溯 
			l[j]=0;
			c[i+j]=0;
			d[i-j+n]=0;
		 } 
		
	}
 } 

int main()
{
	scanf("%d",&n);
	dfs(1);//從第一個開始
	printf("%d",sum);
	return 0; 
 }