Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1 8 5 0
Sample Output
1 9210
按行搜索,开两个标记数组,一个用于标记列号是否使用,一个用来标记当前行的列数
涉及大量重复计算,打表,避免超时
<pre name="code" class="cpp">#include<iostream> #include<cstring> using namespace std; int book[12];//对列进行标记. int row_col[12];//每一行的列号进行记录; int n;//棋盘大小 int ans[11];//提前打表记录结果 int cnt;//统计每一次的结果 void dfs(int x)//行搜索 { if(x==n+1) { cnt++; return; } for(int column=1;column<=n;column++)//遍历每一列 { int flag; if(!book[column])//如果此列没有被标记 { flag=1; for(int row=1;row<x;row++)//如果也不在同一对角线上,也就是行坐标差不等于列坐标之差 { if( x-row==abs(row_col[row]-column) ) flag=0; } if(flag) { book[column]=1;//标记此列 row_col[x]=column;//记录此行的列数 dfs(x+1); book[column]=0; } } } } int main() { for(n=1;n<=10;n++) { memset(book,0,sizeof(book)); memset(row_col,0,sizeof(row_col)); cnt=0; dfs(1); ans[n]=cnt; } while(cin>>n,n) { cout<<ans[n]<<endl; } return 0; }