题目 :在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
小白里的一道题,回溯法,之前没有将数据打成表,超时了,后来百度到大神打表的做法,代码如pre() {...}
N个皇后,恰号N行,每行放一个皇后,queue[i]=j即表示第i+1行的皇后正处再第j+1列上,然后皇后位置定下来后,看看会不会攻击其他皇后,即位置是否合理,出现不合理的情况,就换个位置继续,若合理,就安排下一个皇后的位置...
代码如下:
#include <iostream>
int n;
int cnt;
int number[10];
int queen[10];
void search(int cur) {
int i, j;
if (cur == n)
cnt++;
else {
for (i = 0; i < n; i++) {
queen[cur] = i;
int ok = 1;
for (j = 0; j < cur; j++) {
if (queen[j] == queen[cur] || cur - queen[cur] == j - queen[j] || cur + queen[cur] == j + queen[j]) {
ok = 0;
break;
}
}
if (ok)
search(cur + 1);
}
}
}
void pre() {
int i;
for (i = 1;i <= 10;i++) {
n = i;
cnt = 0;
search(0);
number[n] = cnt;
}
}
int main() {
pre();
while (scanf_s("%d", &n) && n!= 0) {
printf("%d\n",number[n]);
}
return 0;
}