• 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
    
    */
  • 相关阅读:
    编程心得5
    编程心得2
    心得2
    心得1
    7-11
    7-13
    7-9
    7-8
    7-12
    7-14
  • 原文地址:https://www.cnblogs.com/general10/p/5731397.html
Copyright © 2020-2023  润新知