CF:Jokewithpermutation

Jokewithpermutation

Input ?le: joke.in
Output ?le: joke.out
Joey had saved a permutation of integers from 1 to n in a text ?le. 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 ?le.
Help Joey to restore the original permutation after the Joe’s joke!
Input
The input ?le 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 ?le with the restored permutation. Don’t forget the spaces!
If there are several possible original permutations, write any one of them.
Sample input and output
joke.in

4111109876532

joke.out

4 1 11 10 9 8 7 6 5 3 2





题意:输入一排数字,所有的数字之间没有空格隔开,这些数字由1-n组,字符串的长度最少为1,最多为50。输出那一排数字,并用空格隔开。

这一题是一道经典的dfs搜索,按照我的dfs搜索方法,要把10,20先区分开。搜索到的当前状态是字符串的第i个字符,如果这个数字没有被标记,那就搜索dfs(i+1,t+1);如果这个数字被标记的话,再判断这个数字是否小于3,如果小于3的话,那么和后面那个字符一起组合成一个数字,如果这个数字没有被标记的话,那么就搜索dfs(i+1,t+1);

如果都不符合的话,那就return回溯。要注意dfs搜索不符合要求的话,要记得把数字的标记状态回溯恢复一下。





#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[55];
int flag[31];
int x[31];
int len,n;
void dfs(int i,int t);
int main()
{
    freopen("joke.in","r",stdin);
    freopen("joke.out","w",stdout);
    int i;
    memset(s,0,sizeof(s));
    memset(x,0,sizeof(x));
    memset(flag,0,sizeof(flag));
    while(scanf("%s",s)!=EOF)
    {
        len=strlen(s);
        if(len<10) //优化,如果都是十以内
        {
            n=len;
            for(i=0; i<n-1; i++)
                printf("%c ",s[i]);
            printf("%c\n",s[i]);
        }
        else
        {
            n=(len-11)/2+10;
            //cout<<len<<" "<<n<<endl;
            dfs(0,0);
            for(i=0; i<n-1; i++)
                printf("%d ",x[i]);
            printf("%d\n",x[i]);
        }
        memset(s,0,sizeof(s));
        memset(x,0,sizeof(x));
        memset(flag,0,sizeof(flag));
    }
    return 0;
}
void dfs(int i,int t)
{
    if(i==len) return;
    if((i+1)<len&&s[i+1]==‘0‘) //注意10,20这两个数据,比较特殊
    {
        flag[(s[i]-48)*10]=1;
        x[t]=(s[i]-48)*10;
        dfs(i+2,t+1);
        flag[(s[i]-48)*10]=1;
    }
    else if(flag[s[i]-48]==0)
    {
        flag[s[i]-48]=1;
        //cout<<s[i]-48<<" 1"<<endl;
        x[t]=s[i]-48;
        dfs(i+1,t+1);
        flag[s[i]-48]=0;
        //cout<<s[i]-48<<" 0"<<endl;
    }
    else if((s[i]-48)<3&&(i+1)<len&&flag[(s[i]-48)*10+(s[i+1]-48)]==0)
    {
        flag[(s[i]-48)*10+(s[i+1]-48)]=1;
        //cout<<(s[i]-48)*10+(s[i+1]-48)<<" 1"<<endl;
        x[t]=(s[i]-48)*10+(s[i+1]-48);
        dfs(i+2,t+1);
        flag[(s[i]-48)*10+(s[i+1]-48)]=0;
        //cout<<(s[i]-48)*10+(s[i+1]-48)<<" 0"<<endl;
    }
    return;
}

时间: 2024-10-29 19:10:45

CF:Jokewithpermutation的相关文章

cf:c题

题目: 代码: #include<iostream> #include<algorithm> #include<vector> #include<string> #include<math.h> const int max_=1e5+5; using namespace std; vector<int>ve[max_]; int sum[max_]; int main() { int n,m; int ans,maxm=0; int

实践:搭建基于Load Balancer的MySql Cluster

服务器规划: 整套系统全部在rhel5u1 server 64位版本下,由基于xen的虚拟机搭建,其中集群管理节点*2.SQL节点*2.数据节点*4.Web服务节点*2组成,其中数据节点做成2个组,每组两台的形式: 虚拟机mysql_mgm-1, 192.168.20.5:集群管理节点,id=1 虚拟机mysql_mgm-2, 192.168.20.6:集群管理节点,id=2 虚拟机mysql_sql-1,192.168.20.7:SQL节点,mysql服务器节点,id=3 虚拟机mysql_s

机器学习:Python实现聚类算法(三)之总结

考虑到学习知识的顺序及效率问题,所以后续的几种聚类方法不再详细讲解原理,也不再写python实现的源代码,只介绍下算法的基本思路,使大家对每种算法有个直观的印象,从而可以更好的理解函数中参数的意义及作用,而重点是放在如何使用及使用的场景. (题外话: 今天看到一篇博文:刚接触机器学习这一个月我都做了什么?  里面对机器学习阶段的划分很不错,就目前而言我们只要做到前两阶段即可) 因为前两篇博客已经介绍了两种算法,所以这里的算法编号从3开始. 3.Mean-shift 1)概述 Mean-shift

每日一记:邮件服务器:Postfix

邮件服务器:Postfixmail server与DNS的关系:1.架设mail server 必须要有合法的主机名2.DNS的反解也很重要要架设一部mail server,务必向上层ISP申请IP反解的对应,不要使用预设的反解主机名,否则会是你的邮件服务器发出的信件被视为垃圾信件不申请IP的反解,则可利用relayhost或者是smarthost来处理邮件传递的问题,也涉及到上层ISP的问题3.需要DNS的MX及A标准:先传送给带MAX标志的邮件主机,如果没有再传给带A标志的主机:MAX标志的

centos7.2下搭建postfix++dovecot+courier-authlib+extmail邮件收发系统

专业的事由专业的人去做,现在DNS,mail邮箱系统基本都是专业的公司去做了,越来越少公司自己搭建DNS,mail等系统服务 这次由于服务器要迁移,公司的邮箱系统一直都是用开源的postfix的,只能自己折腾 在此记录一下,搭建全过程使用root账号,中间有一些错误调试的,都给忽略了,这里只给出最的配置 在文章最后面会有一些错误调试的记录 不管遇到什么错误,首先打印日志来看! 不管遇到什么错误,首先打印日志来看! 不管遇到什么错误,首先打印日志来看! 在网上大概了解了一下整个邮箱系统的组成: #

GCC内嵌AT&amp;T汇编语法

一 基本语法 1 寄存器引用 引用寄存器要在寄存器号前加百分号%,如"movl %eax, %ebx". 80386有如下寄存器: 1.8个32-bit寄存器 %eax,%ebx,%ecx,%edx,%edi,%esi,%ebp,%esp: 2.8个16-bit寄存器,它们事实上是上面8个32-bit寄存器的低16位:%ax,%bx,%cx,%dx,%di,%si,%bp,%sp: 3.8个8-bit寄存器:%ah,%al,%bh,%bl,%ch,%cl,%dh,%dl.它们事实上是寄

信息安全系统设计基础期中总结

Chapter 00 Linux基础 man命令调用手册页 man <command_name> 手册通常被分为8个区段,要查看相应区段的内容,就在 man 后面加上相应区段的数字即可: 1 一般命令 2 系统调用 3 库函数,涵盖了C标准函数库 4 特殊文件(通常是/dev中的设备)和驱动程序 5 文件格式和约定 6 游戏和屏保 7 杂项 8 系统管理命令和守护进程 man有一个-k 选项用起来非常好,这个选项让你学习命令.编程时有了一个搜索引擎,可以举一反三.结合后面学习的grep 命令和

程序的机械级表示学习记录

程序的机械级表示学习记录 X86的三代寻址方式 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全. 8086的分段模式. IA32的带保护模式的平坦模式. 对于机械级编程的两种重要抽象 ISA:机械级程序的格式和行为,定义为指令集体系结构,它定义了处理器状态.指令的格式,以及每条指令对状态的影响. 虚拟地址:机器级程序使用的存储器地址,提供的存储器模型看上去是一个非常大的数组.存储器系统的实际实现是将多个硬件存储器和操作系统软件组合起来的. 在GCC中获得汇编代码与反汇编 获得汇编代码:

我的LINUX基础笔记

Linux系统管理      1 Day   2014.5.23 su -name   切换用户passwd 密码   更改密码gnome-terminal    伪CLI   桌面终端程序1.查看内核版本uname -r    2.查看红帽系统版本cat /etc/redhat-rdlease3.查看LINUX标准分发版信息  lsb_release4.查看网卡的IP,MAX       ifconfig                       ifconfig eth 10.0.0.10