题目链接:UVALive 6948 Jokewithpermutation
题意:给一串数字序列,没有空格,拆成从1到N的连续数列。
dfs.
可以计算出N的值,也可以直接检验当前数组是否合法。
#include <stdio.h>
#include <iostream>
#include <string.h>
#define maxn 100
using namespace std;
char str[maxn];
int num[maxn];
bool vis[maxn];
int cnt;
int len;
int N;
bool ok = false;
bool dfs(int id, int pos) {
    if (ok) return false;
    if (pos == len && id == N) {
        cnt = id;
        ok = true;
        return true;
    }
    if (pos >= len) return false;
    num[id] = str[pos] - '0';
    if (num[id] >= 1 && num[id] <= N && !vis[num[id]]) {
        vis[num[id]] = 1;
        if (dfs(id+1, pos+1)) return true;
        //dfs(id+1, pos+1);
        vis[num[id]] = 0;
    }
    num[id] = (str[pos]-'0')*10 + str[pos+1]-'0';
     if (num[id] >= 1 && num[id] <= N && !vis[num[id]]) {
        vis[num[id]] = 1;
        if (dfs(id+1, pos+2)) return true;
        //dfs(id+1, pos+2);
        vis[num[id]] = 0;
    }
    return false;
}
int main() {
    //freopen("in.cpp", "r", stdin);
    while(~scanf("%s", str)) {
        ok = false;
        len = strlen(str);
        cnt = 0;
        N = (len>9?9:len)+(len>9?(len-9)/2:0);
        memset(vis, 0, sizeof(vis));
        dfs(0, 0);
        for (int i=0; i<cnt; ++i) {
            if (i == 0) printf("%d", num[i]);
            else printf(" %d", num[i]);
        }
        printf("\n");
    }
    return 0;
}
dfs要优雅...
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号