回溯法
注意return的用法 找到结果了就直接退出dfs
还有就是数组下标的处理要注意
#include<bits/stdc++.h> using namespace std; int n,l; int cnt; int ans[1000]; int dfs(int cur) { if(cnt++==n) { for(int i=0;i<cur;i++) { if(i%4==0&&i>0) { if(i%64==0) cout<<endl; else printf(" "); } putchar('A'+ans[i]); } printf(" %d ",cur); return 0; } for(int i=0;i<l;i++) { ans[cur]=i; int ok=1; for(int j=1;j*2<=cur+1;j++) { int equa=1; for(int k=0;k<j;k++) { if(ans[ cur-k ]!=ans[ cur-j-k ] ){ equa=0;break; } } if(equa){ok=0;break;} } if(ok) if(!dfs(cur+1))return 0;//用return 0来结束回溯 } return 1; } int main() { while(scanf("%d%d",&n,&l)==2&&n&&l) { cnt=0; dfs(0); } }