#include <stdio.h>
#include <math.h>
#include <string.h>
int queenPlaces[92][8]; //存放92种皇后棋子的摆放方法
int count = 0;
int board[8][8]; //仿真棋盘
void putQueen(int ithQueen) {
int i, k, r;
if(ithQueen == 8) {
count ++;
return;
}
for(i = 0; i < 8; i ++) {
if(board[i][ithQueen] == -1) {
board[i][ithQueen] = ithQueen;
//将其后所有的摆放方法的第ith个皇后都放在i+1的位置上
//在i增加后,后面的第ith个皇后摆放方法后覆盖此时的设置
for(k = count; k < 92; k ++)
queenPlaces[count][ithQueen] = i + 1;
//设置控制范围
for(k = 0; k < 8; k ++)
for(r = 0; r < 8; r ++)
if(board[k][r] == -1 && (k == i || r == ithQueen || abs(k - i) == abs(r - ithQueen)))
board[k][r] = ithQueen;
putQueen(ithQueen + 1);
//回溯,撤销控制范围
for(k = 0; k < 8; k ++)
for(r = 0; r < 8; r ++)
if(board[k][r] == ithQueen)
board[k][r] = -1;
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int n, i, j;
for(i = 0; i < 8; i ++) {
for(j = 0; j < 8; j ++)
board[i][j] = -1;
for(j = 0; j < 92; j ++)
queenPlaces[j][i] = 0;
}
putQueen(0);
scanf("%d", &n);
for(i = 0; i < n; i ++) {
int ith;
scanf("%d", &ith);
for(j = 0; j < 8; j ++)
printf("%d", queenPlaces[ith - 1][j]);
printf("\n");
}
return 0;
}
上面的方法用一个二维数组来记录棋盘被已经放置的棋子的控制情况,每次有新的棋子放置时用了枚举法来判断它的控制范围。
还可以用一个三维数组来分别记录每一列,每个45度斜线和每个135度的斜线上是否已经被已放置的棋子控制,这样,每次有新的
棋子放置时,不必再搜素它的控制范围,可以直接通过三个一维数组判断它是否与已经放置的棋子冲突,在不冲突的情况下,
在不冲突的情况下,也可以通过分别设置三个一维数组的相应值,来记录新棋子的控制范围。
#include <stdio.h>
int record[92][9], mark[9], count = 0; //记录全部解,maek记录当前解
int range[9], line1[17], line2[17]; //分别记录列方向,45度,135度方向上被控制的情况
void tryToPut(int i) {
if(i > 8) {//如果最后一个皇后放置完毕,将当前解复制到全部解中
for(int k = 1; k < 9; k ++)
record[count][k] = mark[k];
count ++;
}
for(int j = 1;j <= 8; j ++) {//逐一尝试将当前皇后放置在不同列上
if(range[j] && line1[i + j] && line2[i - j + 9]) {//如果与前面的不冲突,则把当前皇后放置在当前位置
mark[i] = j;
range[j] = line1[i + j] = line2[i - j + 9] = false;
tryToPut(i + 1);
range[j] = line1[i + j] = line2[i - j + 9] = true;
}
}
}
int main() {
int i, testtimes, num;
scanf("%d", &testtimes);
for(i = 0; i < 8; i ++)
range[i] = true;
for(i = 0; i < 17; i ++)
line1[i] = line2[i] = true;
tryToPut(1);
while(testtimes --) {
scanf("%d", &num);
for(i = 1; i <= 8; i ++)
printf("%d", record[num - 1][i]);
printf("\n");
}
return 0;
}
八皇后问题
最新推荐文章于 2025-07-23 22:59:22 发布