码迷,mamicode.com
首页 > 其他好文 > 详细

UVALive 6948 Jokewithpermutation 深搜

时间:2016-08-03 07:53:13      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:

题意就是把一段序列拆成从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?"\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

*/

 

UVALive 6948 Jokewithpermutation 深搜

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!