因此,不要误以为此题没有回溯的过程,只有不断向下的过程。
对应到代码中,就是递归函数的入口点需要进行考虑。
if(ok){
//return solve(cur + 1); 这是不对的,这样将造成无法继续循环,即无法回溯。
if(!solve(cur + 1))
return 0; //返回是有条件的。
}
另外,需要注意,由于cur并非就是n;进入了几次递归函数,就对于第几个
#include<bits/stdc++.h> using namespace std; const int maxn = 10000 + 3; int n, L; int A[maxn]; int cnt; int solve(int cur) { if(cnt++ == n){ //每solve一次,将产生一个解。 int cnt = 0; for(int i = 0; i < cur; i++){ printf("%c", A[i] + 65); if(++cnt == 4){ if((i + 1) % 64 == 0) cout << endl; else if(i != cur - 1) cout << ' '; cnt = 0; } } if(cur % 64 != 0) cout << endl; cout << cur << endl; return 0; }else{ for(int i = 0; i < L; i++){ A[cur] = i; int mid = cur/2; bool ok = true; for(int j = cur; j > mid; j--){ //枚举后缀的左边界 bool flag = 0; int sz = cur - j + 1; for(int k = j; k <= cur; k++){ if(A[k] != A[k-sz]){ flag = 1; break; } } if(!flag){ ok = false; break; } } if(ok){ //return solve(cur + 1); if(!solve(cur + 1)) return 0; } } } return 1; } int main() { //freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); while(cin >> n >> L && n){ cnt = 0; solve(0); } return 0; }
最后是输出格式,格外需要注意。