回溯法的再次利用,体会精妙之处。 多研究,多做题~~
#include<bits/stdc++.h> using namespace std; int n,L,cnt,s[100]; int dfs(int cur) { if(cnt++==n) { int kase=0,ans=0,ens=0; for(int i=0;i<cur;i++){ printf("%c",'A'+s[i]); kase++; ens++; if(kase==4) { kase=0; ans++; } if(ans!=16&&kase==0&&i!=cur-1) printf(" "); if(ans==16) { printf("\n"); ans=0; } } if(ans==0&&kase==0) ; else printf("\n"); printf("%d\n",ens); return 0; } for(int i=0;i<L;i++) { s[cur]=i; int ok=1; for(int j=1;j*2<=cur+1;j++){ int equ=1; for(int k=0;k<j;k++) if(s[cur-k]!=s[cur-k-j]) { equ= 0; break; } if(equ) { ok=0; break; } } if(ok) if(!dfs(cur+1)) return 0; } return 1; } int main() { while(scanf("%d%d",&n,&L)!=EOF) { if(n==0&&L==0) return 0; memset(s,0,sizeof(s)); cnt=0; dfs(0); } return 0; }
原文地址:http://blog.csdn.net/weizhuwyzc000/article/details/44178151