八皇后位置,利用回溯法解决
直接利用回溯法:
#include <stdio.h>
int n, tot = 0;
int C[1000] = {0};
void search(int cur){
if(cur == n){ //边界
tot++;
} else {
for(int i = 0; i < n; i++){
int ok = 1;
C[cur] = i; //尝试把第cur行的皇后放在第i位
for(int j = 0; j < cur; j++){ //检验是否有冲突
if(C[cur] == C[j] || cur - C[cur] == j - C[j] || cur + C[cur] == j + C[j]){
ok = 0;
break;
}
}
if(ok) search(cur + 1); //放在这个位置可以
}
}
}
int main(){
scanf("%d", &n);
search(0);
printf("%d\n", tot);
return 0;
}
将每一种结果输出:
#include <stdio.h>
int n, tot = 0;
int C[1000];
void show(int cur){
if(cur == n){
tot++;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(j == C[i]){
printf("h ");
} else {
printf("+ ");
}
}
printf("\n");
}
printf("\n\n");
} else {
for(int i = 0; i < n; i++){
int ok = 1;
C[cur] = i;
for(int j = 0; j < cur; j++){
if(C[cur] == C[j] || cur - C[cur] == j - C[j] || cur + C[cur] == j + C[j]){
ok = 0;
break;
}
}
if(ok) show(cur + 1);
}
}
}
int main(){
scanf("%d", &n);
show(0);
printf("%d", tot);
return 0;
}