同行同列好判断。
判断对角线上的时候要注意,因为 成45°,所以斜率 k = ± 1。 又因为 (x - x1 )/ (y - y1) = k
所以有(x -x1)/(y - y1) = ± 1 --> |x -x1| / | y - y1| = 1 --> |x - x1| == | y -y1|
满足这种情况就是在对角线上
要注意的是 要放满 n 个皇后
刚开始没注意 在后面又加了个 dfs(x + 1)。
#include <cstdio> #include <iostream> #include <cstring> using namespace std; int const MAXN = 20; int hash1[MAXN][MAXN],s[MAXN]; int sum,cnt; void Init(){ memset(hash1,0,sizeof(hash1)); sum = 0; cnt = 0; } int Fabs(int x){ return x > 0 ?x : -x; } bool Judge(int x,int y,int n){ for(int i = 1;i <= n;i++){ if(hash1[i][y]) return false; } for(int i = 1;i <= n;i++){ for(int j = 1;j <= n;j++){ if(Fabs(i - x) == Fabs(j - y)){ if(hash1[i][j]) return false; } } } return true; } void Dfs(int x,int n){ for(int i = 1;i <= n;i++){ if(cnt == n){ sum++; return ; } if(x > n) return ; if(!hash1[x][i] && Judge(x,i,n)){ cnt++; hash1[x][i] = 1; Dfs(x + 1,n); cnt--; hash1[x][i] = 0; } } //Dfs(x + 1,n); } int main(){ for(int i = 1;i <= 10;i++){ Init(); Dfs(1,i); s[i] = sum; } int n; while(~scanf("%d",&n),n){ printf("%d\n",s[n]); } return 0; }