题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553
#include <iostream>
using namespace std;
/****************************************************************************************************************
题意:在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击
(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
思路:
1,经典老题了,dfs,剪枝是关键!!!
2,23333,我明显没有剪枝,直接打表,因为题目数据最大就是 10,(根本就不是N皇后)
3,难点在于 : 不允许处在与棋盘边框成45角的斜线上,这个怎么描述。
后来看网上这么写 : i-id == ID[j]-j || i+id == ID[j]+j
即到对角线距离不想等。想的太简洁了。
4,网上还有一种位运算的解法,不用打表,相当省时间。
不会位运算,以后再看吧!碰到好几次了,好有用的样子!!!
****************************************************************************************************************/
int n,num;
int ID[11];
void dfs(int id)
{
int flag;
if(id==n+1){
num++;
return;
}
else{
for(int i = 1;i <= n;i ++){
ID[id]=i; //尝试所有位置
flag=1;
for(int j = 1;j < id;j ++){
if(ID[j] == i || i-id == ID[j]-j || i+id == ID[j]+j){ //不在同一行,不在对角线
//即到对角线距离不想等
flag=0;
break;
}
}
if(flag)
dfs(id+1);
}
}
}
int main()
{
int m;
int ans[11];
for(n = 1;n <= 10;n ++){
num=0;
dfs(1);
ans[n]=num;
}
while(cin>>m){
if(m == 0 || m > 10) break;
cout<<ans[m]<<endl;
}
return 0;
}