zoukankan      html  css  js  c++  java
  • 计算之道 (置换的玩笑)搜索

    小蒜头又调皮了。这一次,姐姐的实验报告慘遭毒手。

    姐姐的实验报告上原本记录着从 1 到 n 的序列。随意两个数字间用空格间隔。

    可是“坑姐”的蒜头竟然把数字间的空格都给删掉了。整个数字序列变成一个长度为 1 到 100 的且首部没有空格的数字串。

    如今姐姐已经怒了。蒜头找你写个程序快点把试验数据复原。

    输入

    输入文件有一行,为一个字符串——被蒜头搞乱的实验数据。

    字符串的长度在 1 到 100 之间。

    输出

    输出共一行。为姐姐的原始測试数据—— 1 到 n 的输出。

    随意两个数据之间有一个空格。

    例子1

    输入:

    4111109876532

    输出:

    4 1 11 10 9 8 7 6 5 3 2
    #include<stdio.h>
    #include<string.h>
    #include<vector>
    using namespace std;
    
    int flag[105],ok,vist[105],len;
    vector<int>loc[60];
    char s[105];
    
    void dfs(int num){
        if(num==0){
            ok=1;
            int i=0;
            do{
                printf("%c",s[i]); i++;
            }while(flag[i]==0);
            while(i<len){
                printf(" ");
                do{
                    printf("%c",s[i]); i++;
                }while(flag[i]==0);
            }
            printf("
    ");
            return ;
        }
        for(int i=loc[num].size()-1; i>=0; i--){
            int j=loc[num][i];
            if(num<=9){
                if(vist[j]==0)
                {
                    vist[j]=1;
                    flag[j]=1;
                    dfs(num-1);
                    if(ok)return ;
                    vist[j]=0;
                    flag[j]=0;
                }
            }
            else if(vist[j]==0&&vist[j+1]==0)
            {
                vist[j]=vist[j+1]=1;
                flag[j]=1;
                dfs(num-1);
                if(ok)return ;
                vist[j]=vist[j+1]=0;
                flag[j]=0;
            }
        }
    }
    
    int main(){
    
        while(scanf("%s",s)>0){
            len=strlen(s);
            int maxnum;
            ok=0;
            memset(vist,0,sizeof(vist));
            memset(flag,0,sizeof(flag));
            flag[len]=1;
            if(len<=9)
                maxnum=len;
            else
                maxnum=(len-9)/2+9;
            for(int i=1; i<=maxnum; i++){
                loc[i].clear();
                for(int j=0; j<len; j++)
                if(i<=9){
                    if(s[j]-'0'==i)
                        loc[i].push_back(j);
                }
                else if(i==(s[j]-'0')*10+s[j+1]-'0'&&j+1<len)
                    loc[i].push_back(j);
            }
             dfs(maxnum);
        }
    }
    


  • 相关阅读:
    Pika的设计及实现
    高性能网络编程
    C语言的结构体
    消息队列库——ZeroMQ
    Diffie-Hellman密钥交换算法
    mysql-proxy 读写分离
    位运算
    分布式学习之一:事务
    Redis Cluster
    SpringBoot整合ActiveMQ,看这篇就够了
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7097100.html
Copyright © 2011-2022 走看看