zoukankan      html  css  js  c++  java
  • Joke with permutation 分类: ACM 2015-08-03 14:09 1

    Joke with permutation
    Time Limit: 3000ms, Special Time Limit:7500ms, Memory Limit:65536KB
    Total submit users: 87, Accepted users: 60
    Problem 13341 : Special judge
    Problem description

    Joey had saved a permutation of integers from 1 to n in a text file. All the numbers were written as decimal numbers without leading spaces.

    Then Joe made a practical joke on her: he removed all the spaces in the file.

    Help Joey to restore the original permutation after the Joe’s joke!

    Input

    The input file contains a single line with a single string — the Joey’s permutation without spaces.

    The Joey’s permutation had at least 1 and at most 50 numbers.

    Output

    Write a line to the output file with the restored permutation. Don’t forget the spaces!

    If there are several possible original permutations, write any one of them.

    Sample Input
    4111109876532

    Sample Output
    4 1 11 10 9 8 7 6 5 3 2

    Problem Source
    NEERC 2014
    题意是给出一个全排列的字符串,然后让你确定排列两个元素之间的空格位置。
    先根据字符串的长度求出n是多大,然后用dfs搜索符合条件的排列。

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #define maxn 500
    using namespace std;
    int n,l,cnt;
    int flag[maxn];
    char str[maxn];
    int hash[maxn];
    bool ll; 
    void dfs(int k)//k表示当前处理到哪个字符
    {
            if(ll)
            return ;
            if(k>=n)
            {
            for(int i=0;i<n;i++)
            {
                printf("%c",str[i]) ;
                if(flag[i]&&i!=n-1)
                printf(" ");  
    
            } //当K>n时,输出排列,return 
            ll=1; 
            return ;
             }
            if(!hash[str[k]-'0']&&(k+1>=n||str[k+1]!='0'))//一个字有两种组合,要么自己组成一个数,要么和后面的字符组成两位数,注意组合完之后, 字符串的第一个不能是零
            {
                hash[str[k]-'0']=1;
                flag[k]=1;
                dfs(k+1);
                flag[k]=0;//整数不可取,回退
                hash[str[k]-'0']=0;
            }
           if(!hash[(str[k]-'0')*10+str[k+1]-'0']&&((str[k]-'0')*10+(str[k+1]-'0'))<=cnt&&(str[k+2]!='0'||k+2>=n))    
           {
                  hash[(str[k]-'0')*10+str[k+1]-'0']=1;
               flag[k+1]=1;
               dfs(k+2);
               flag[k+1]=0;
               hash[(str[k]-'0')*10+str[k+1]-'0']=0;
        }           
        }
    int main()
    {
        while(scanf("%s",str)!=EOF)
        {
            n=strlen(str);
            if(n<=9)
            {
                for(int i=0;i<n-1;i++)
                printf("%c ",str[i]);
                printf("%c
    ",str[n-1]); 
                continue; 
            }    
            int num=n-9;
            cnt=9+num/2;
            ll=0; 
            memset(hash,0,sizeof(hash));
            memset(flag,0,sizeof(flag));
            dfs(0);
            printf("
    ");
        }
        return 0;
    }
    
    
  • 相关阅读:
    kindle--瓦尔登湖
    8051
    c++
    Linux安装目录的选择
    Redis键值数据类型之散列类型
    Redis键值数据类型之字符串
    redis基本使用
    Ubuntu18.04 Redis安装
    Java String和int转换
    mysql获得自增主码的值
  • 原文地址:https://www.cnblogs.com/NaCl/p/9580187.html
Copyright © 2011-2022 走看看