回溯只需要用8!次来解。。。4万次计算而已。。
8^8可是1千600多万种结果。。这是穷举的方法。。不是递归
递归和穷举有区别。这个在放皇后之前有用notDanger去查是否可以放,不可以放就直接跳过该格子。具体多少次计算我也不大会算。但这绝对不是穷举的方法。
附上我学过的代码。#include <cstdio>
#include <cstdlib>
#include <cstring>
int row[8];
int tc,a,b,solc;
bool place (int r, int c){
for (int prev=0;prev<c;prev++){
if (row[prev]==r||(abs(prev-c)==abs(row[prev]-r)))return false;
}
return true;
}
void backtrack(int n){
if (n==8){
printf("第%d种\n",++solc);
for (int j=0;j<8;j++){
for (int i=0;i<8;i++){
if (row[i]==j)printf ("1 ");
else printf("0 ");
}
printf("\n");
}
}
for (int r=0;r<8;r++){
if (place(r,n)){
row[n]=r;
backtrack(n+1);
}
}
}
int main()
{
memset(row,0,sizeof(row));
solc=0;
backtrack(0);
return 0;
}
|