uva129_Crypton Factor(有个疑点,为什么递归边界是cnt++==n,每执行一次solve产生一个解?)

因此,不要误以为此题没有回溯的过程,只有不断向下的过程。

对应到代码中,就是递归函数的入口点需要进行考虑。

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;
}

最后是输出格式,格外需要注意。

猜你喜欢

转载自www.cnblogs.com/sanshi-2018/p/10453120.html
今日推荐