zoukankan      html  css  js  c++  java
  • Joke with permutation 分类: ACM 2015-08-03 14:09 1人阅读 评论(0) 收藏

    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;
    }
    
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    LeetCode——Generate Parentheses
    LeetCode——Best Time to Buy and Sell Stock IV
    LeetCode——Best Time to Buy and Sell Stock III
    LeetCode——Best Time to Buy and Sell Stock
    LeetCode——Find Minimum in Rotated Sorted Array
    Mahout实现基于用户的协同过滤算法
    使用Java对文件进行解压缩
    LeetCode——Convert Sorted Array to Binary Search Tree
    LeetCode——Missing Number
    LeetCode——Integer to Roman
  • 原文地址:https://www.cnblogs.com/NaCl/p/4700583.html
Copyright © 2011-2022 走看看