在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
因为我们要保证每个皇后不在同一个对角线,不在一行,不在一列
所以我们每次把第k个皇后放在第k行,即保证每个皇后都不在同一行
接下来我们要判断每个皇后是否在一列或者对角线即可
我们设一个queen数组表示每个皇后所放位置所在列
prey == ny || prey-prex == ny-nx || prey + prex == ny + nx
如果以上条件都不成立,那么皇后k的放置就是合理的
1 #include<iostream> 2 #include<cstdio> 3 int Queen[20],n; 4 int dp[15]; 5 int dfs(int k) 6 { 7 if (k>n) 8 return 1; 9 int ans = 0; 10 for (int i = 1 ;i<= n ;i++) 11 { 12 int nx = k, ny = i;//把第k个皇后放在第k行 13 bool isOk = true; 14 for (int j = 1; j< k && isOk ;j++) 15 { 16 int prex = j, prey = Queen[j];//放过的皇后 17 if (prey == ny || prey-prex == ny-nx || prey + prex == ny + nx)//在同一列、一个对角线 不合法 18 isOk = false; 19 } 20 if (isOk) 21 { 22 Queen[k] = i;//k个皇后在k行i列 23 ans += dfs(k+1); 24 } 25 } 26 return ans; 27 } 28 int main() 29 { 30 while(scanf ("%d",&n)&&n!=0) 31 { 32 //缩短时间 33 if (dp[n]==0) 34 dp[n]=dfs(1); 35 printf ("%d ",dp[n]); 36 } 37 return 0; 38 }