题目链接
第一遍,超时
原因大概是多组输入,不限制次数,而每次都进行递归会耗费大量时间
TLE代码:
#include<iostream>
using namespace std;
int n,num;
int a[20],col[20],dg[20],udg[20];
void dfs(int row){
if(row==n+1){
num++;
return;
}
for(int i=1;i<=n;i++){
if(col[i]==0&&dg[row+i]==0&&udg[row-i+n]==0){
a[row]=i;
col[i]=dg[row+i]=udg[row-i+n]=1;
dfs(row+1);
col[i]=dg[row+i]=udg[row-i+n]=0;
a[row]=0;
}
}
}
int main(){
while(~scanf("%d",&n)&&n!=0){
num=0;
dfs(1);
printf("%d\n",num);
}
return 0;
}
而题中n的取值很小,1-10,可以先全部计算出,再直接调用
AC代码:
#include<iostream>
using namespace std;
int col[20],dg[20],udg[20],a[20],ans[20],num,n;
void dfs(int row){
if(row==n+1){
num++;
return;
}
for(int i=1;i<=n;i++){
if(!col[i]&&!dg[row+i]&&!udg[row-i+n]){
a[row]=i;
col[i]=dg[row+i]=udg[row-i+n]=1;
dfs(row+1);
col[i]=dg[row+i]=udg[row-i+n]=0;
a[row]=0;
}
}
}
int main(){
for(n=1;n<=10;n++){
num=0;
dfs(1);
ans[n]=num;
}
while(~scanf("%d",&n)&&n!=0){
printf("%d\n",ans[n]);
}
return 0;
}