问题描述:在N×N格的国际象棋上摆放N个皇后,使其不能互相攻击,即不能处于同一列或同一行,也不能处在同一斜线上,请问有多少种摆法?
不能放皇后的位置及位置之间的关系:
二、代码实现
#include三、运行结果int array[20];//数组大小,a[i] = j表示第i个皇后放在第i行的第j个位置 int n,cnt;//n为皇后的个数 int check(int x,int y)//x为行,y为放置的位置 { int i = 1; for(;i <= x ;i++) { if(array[i] == y)return 0;//前面几行已经在y位置上有元素 if(array[i] + i == x + y)return 0;//上右下左对角线 if(i - array[i] == x-y)return 0;//上左下右对角线 } return 1; } void dfs(int row)//第row个皇后 { int i,j; if(row == n+1)//此时已有一个解 { cnt++; for(j=1;j<=n;j++) { printf("%d ",array[j]); } printf("n"); return ; } for(i = 1;i <= n;i++)//从一横排的所有位置开始,判断是否该位置能放皇后 { if(check(row,i)) //第row个皇后能否放在i位置 { array[row] = i; dfs(row+1);//接着放下一个 array[row] = 0;//回溯 } } } void main() { scanf("%d",&n); dfs(1); printf("%d个皇后一共有%d个解",n,cnt); }
四、总结
主要是要搞清楚不能放的位置之间的数字关系



