在棋盘上去放置8个皇后,任意两个点不在同一行,同一列,同意斜线上。
Find a way to arrange 8 queens on a chess board so that none of them share
the same row, column or diagonal.
此题使用回溯的解法。对于每一行,检查放置皇后的列,看这一列是否符合条件。
1.为了决定哪一列放这个皇后,我们存储每一行的皇后所在的列数。设数组 ColumnForRow[]存储每一行皇后所在的列数。
2.验证包括三种情况:
>>同一列:ColumnForRow[i] == ColumnForRow[j]
>>同一斜线:(ColumnForRow[i] - ColumnForRow[j] ) == ( i- j) 或
(ColumnForRow[j] - ColumnForRow[i]) == (i - j)
以上均为非法情况。
下面是8皇后问题找到一个可能解的编码。
We will use a backtracking algorithm. For each row, the column where we want to put the
queen is based on checking that it does not violate the required condition.
1. For this, we need to store the column of the queen in each row as soon as we have finalized
it. Let ColumnForRow[] be the array which stores the column number for each row.
2. The checks that are required for the three given conditions are:
»» On same Column : ColumnForRow[i] == ColumnForRow[j]
»» On same Diagonal: (ColumnForRow[i] - ColumnForRow[j] ) == ( i- j) or
(ColumnForRow[j] - ColumnForRow[i]) == (i - j)
Code to find one possible solution for “8 Queen Problem”
int ColumnForRow[9] = {0}; // We use row numbers 1 through 8
int Check(int row) {
for (int cur = 1; cur < row; ++row) {
int diff = abs(ColumnForRow[cur] - ColumnForRow[row]);
if (diff == 0 || diff == row - cur ) {
return false;
}
}
return true;
}
void PlaceQueen(int row) {
if (row == 9) {
for (int i = 1; i <= 8; ++i) {
printf(“(%d,%d)”, i, ColumnForRow[i]);
}
printf(“\n”);
return; /* line (a) - see note below */
}
/* line (b) - see note below */
for (ColumnForRow[row] = 1; ColumnForRow[row] <= 8; ++ColumnForRow[row]) {
if (Check(row)) {
PlaceQueen(row + 1)
}
}
/* line (c) - see note below */
}
int main() {
PlaceQueen(1);
return(0);
}NOTE: If you wanted to generate all queen arrangements, you could do the following:
Line (a): remove return statement
Line (b): add else { Line (c): add }

1374

被折叠的 条评论
为什么被折叠?



