UVALive 6948 Jokewithpermutation 深搜

题意就是把一段序列拆成从1到n的形式

一开始暴力了一下 后来发现bug太多一定是思路不对……

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<map>
#include<vector>
#include<queue>
#define M(a,b) memset(a,b,sizeof(a))
#define N(a) a-'0'
using namespace std;
char s[205];
int way[205];
bool vis[205];
int n;
int lenss;
bool ok;
void dfs(int pos,int num){
    if(pos==lenss){
        ok=true;
        for(int i=1;i<=n;i++)
            printf("%d%s",way[i],i==n?"
":" ");
        return ;
    }
    if(!vis[N(s[pos])]&&N(s[pos])<=n){
        vis[N(s[pos])]=1;
        way[num]=N(s[pos]);
        dfs(pos+1,num+1);
        vis[N(s[pos])]=0;
        if(ok) return ;
    }
    if(pos+1<lenss&&!vis[(s[pos]-'0')*10+(s[pos+1]-'0')]&&(s[pos]-'0')*10+(s[pos+1]-'0')<=n){
        vis[(s[pos]-'0')*10+(s[pos+1]-'0')]=1;
        way[num]=(s[pos]-'0')*10+(s[pos+1]-'0');
        dfs(pos+2,num+1);
        vis[(s[pos]-'0')*10+(s[pos+1]-'0')]=0;
        if(ok) return ;
    }
}
int main(){
    while(gets(s)){
        int lens=strlen(s);
        M(vis,0);
        M(way,0);
        vis[0]=1;
        n=0;
        lenss=0;
        ok=false;
        while(true){
            n++;
            if(n<10) lenss++;
            else lenss+=2;
            if(lenss==lens) break;
        }
        ok=0;
        dfs(0,1);
    }
    return 0;
}

/*

4111109876532

*/
原文地址:https://www.cnblogs.com/general10/p/5731397.html