hdu2533:N皇后问题(dfs)

Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。

 

Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
 

Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
 

Sample Input
   
   
   
   
1 8 5 0
 

Sample Output
   
   
   
   
1 92

10

按行搜索,标记每行的所在列数。

涉及大量重复计算,使用数组储存结果,避免超时

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>

using namespace std;
int map[15];
int ans[15];
int book[15];//对列号进行标记 
int n,cnt;

//按照行进行深搜 
void dfs(int row)
{
	if(row==n+1)
	{
		cnt++;
		return;	
	}
	for(int column=1;column<=n;column++)
	{
		if(!book[column])//保证不在同一列; 
		{
			map[row]=column;
			int flag=1;
			for(int i=1;i<=row-1;i++)//保证前n行不在同一对角线上
			 {
			 	if(abs(map[row]-map[i])==row-i)
			 	{
			 		flag=0;
					 break;
				 }
			 }
			 if(flag)
			 {
			 	book[column]=1;
			 	dfs(row+1);
			 	book[column]=0;
			 }
			 
		}
		
	}
	return;
}
void set()
{
	for(int i=1;i<=10;i++)
	{
		memset(book,0,sizeof(book)) ;
		memset(map,0,sizeof(book));
		n=i;
		cnt=0;
		dfs(1);	
		ans[i]=cnt; 
	}
}
int main()
{
	set();
	while(cin>>n,n)
	{
		cout<<ans[n]<<endl;
	}
	
	return 0;
}


你可能感兴趣的:(hdu2533:N皇后问题(dfs))