链接:点击打开链接
题意:经典问题,N皇后,任意两个皇后不在同行,同列,同一斜线。这样的摆法有多少种。
回溯
我写了两个都超时,没有进行剪枝,是在不想做啦,直接打表。
这个是超时代码,白皮书上有的:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,c[20],sum;
void dfs(int x){
int i,j;
if(x==n)
sum++;
else {
for(i=0;i<n;i++){
int ok=1;
c[x]=i;
for(j=0;j<x;j++){
if(c[x]==c[j]||x-c[x]==j-c[j]||x+c[x]==j+c[j]){
ok=0;
break;
}
}
if(ok)
dfs(x+1);
}
}
}
int main(){
while(~scanf("%d",&n)){
if(n==0)
break;
sum=0;
dfs(0);
printf("%d\n",sum);
}
return 0;
}
打表:
#include<iostream>
using namespace std;
int main(){
int n;
while(~scanf("%d",&n)){
if(n==0)
break;
if(n==2||n==3)
printf("0\n");
else if(n==1)
printf("1\n");
else if(n==4)
printf("2\n");
else if(n==5)
printf("10\n");
else if(n==6)
printf("4\n");
else if(n==7)
printf("40\n");
else if(n==8)
printf("92\n");
else if(n==9)
printf("352\n");
else printf("724\n");
}
return 0;
}