题目链接: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; }