zoukankan      html  css  js  c++  java
  • Joke with permutation

    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;
    }
    
    
  • 相关阅读:
    使用Jenkins进行android项目的自动构建(3)
    使用Jenkins进行android项目的自动构建(2)
    使用Jenkins进行android项目的自动构建(1)
    testlink 从1.8.5 升级到 1.9.8
    779. 第K个语法符号(Leetcode)
    687. 最长同值路径(Leetcode)(递归+树)
    116. 飞行员兄弟(Acwing)(递归+位运算)
    95. 费解的开关(Acwing)(分析+递推)
    Java遇到输入速度瓶颈时的解决办法
    92. 递归实现指数型枚举(Acwing)(递归)
  • 原文地址:https://www.cnblogs.com/NaCl/p/9580205.html
Copyright © 2011-2022 走看看