原文链接: 递归n皇后
上一篇: 递归找迷宫路径
下一篇: 递归组合数
#include <stdio.h>
/*
递归求解n皇后问题,使用数组表示皇后位置
*/
int map[32];//存放棋盘上已经放入的皇后位置 (i,map(i)),下标由1开始
int count = 0;
int abs(int n){//辅助计算绝对值函数
return n > 0 ? n : -n;
}
int issafe(int x, int y){//在(x,y)点是否可以放入皇后
int i;
for (i = 1; i < x; i++){
if (map[i] == y || (abs(x - i) == abs(y - map[i])))
return 0;
}
return 1;
}
void show(int n){//输出结果
int i, j;
printf("第%3d 个解为:\n", count);
for (i = 1; i <= n; i++){
for (j = 1; j <= n; j++){
if (j != map[i])
printf("0 ");
else
printf("1 ");
}
printf("\n");
}
printf("\n");
}
//尝试放入第k个皇后
void place(int k, int n){
if (k == n + 1){
//说明已经放入了n个皇后了
count++;
show(n);
} else {
int i;
for (i = 1; i <= n; i++){
if (issafe(k, i)){//(k,i)点是否可以放入皇后
map[k] = i;
place(k + 1, n);
}
}
}
}
void solve(int n){
place(1, n);
}
int main(int argc, char*argv[]){
int n = 7;
solve(n);
return 0;
}