题目链接: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要优雅...

posted on 2016-08-02 19:00  小小八  阅读(291)  评论(0编辑  收藏  举报