这里两个暴力法的点
第一,递归暴力,默认之前的状态都是符合要求的,只需要讨论目前的状态(八皇后)
第二,用return true 来达到“搜到就输出”的效果
PE懒得改了
#include<cstdio>
using namespace std;
int n,l;
int ans[1000]={0};
int ct=0;
bool dfs(int cur){//cur没填,ct为之前状态,return true 为找到了第n个,就不用继续找了
if(ct++ == n){
int i;
for( i=0;i<cur;i++){
printf("%c",ans[i]+'A'-1);
if(!((i+1)%64)){
printf("\n");
continue;
}
if(!((i+1)%4)){
printf(" ");
}
}
if(i==64)
printf("%d\n",i);
else
printf("\n%d\n",i);
return true;
}
for(int i=1;i<=l;i++){//尝试填入
ans[cur]=i;
int ok=1;
for(int j=1;j*2<=cur+1;j++){
int euq=1;
for(int k=0;k<j;k++){
if(ans[cur-k]!=ans[cur-k-j]){
euq=0;
break;
}
}
if(euq){
ok=0;
break;
}
}
if(ok){
if(dfs(cur+1)) return true;
}
}
return false;
}
int main(void){
while(scanf("%d %d",&n,&l)&&n&&l){
ct=0;
dfs(0);
}
}