N皇后问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 805 Accepted Submission(s): 463
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<stdio.h>
#include<string>
#include<algorithm>
#include<string.h>
using namespace std;
int res[11];
int mp[11][11];
int num;
int n;
int check(int x,int y)
{
for(int i =1;i<=n;i++)
{
if(mp[x][i]||mp[i][y])
{
return 0;
}
}
int xx = x;
int yy = y;
while(!mp[xx][yy])
{
xx--;
yy--;
if((xx)<=0||(yy)<=0)
break;
if(mp[xx][yy])return 0;
}
xx = x;
yy = y;
while(!mp[xx][yy])
{
xx--;
yy++;
if(xx<=0||yy>=(n+1))
break;
if(mp[xx][yy]) return 0;
}
return 1;
}
void dfs(int k ,int h)
{
if(k==0)
{
num ++;
return;
}
for(int j = 1;j<=n;j++)
{
if(!mp[h][j]&&check(h,j))
{
mp[h][j] = 1;
dfs(k-1,h+1);
mp[h][j] =0;
}
}
}
int main()
{
res[1] = 1;
res[2] = 0;
int m;
memset(res,-1,sizeof(res));
while(cin>>m&&m)
{
if(res[m]!=-1)
{
cout<<res[m]<<endl;
continue;
}
memset(mp,0,sizeof(mp));
num =0;
n = m;
dfs(m,1);
res[m] = num;
cout<<res[m]<<endl;
}
return 0;
}