1064 虫食算

2004年NOIP全国联赛提高组

 时间限制: 2 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 查看运行结果
 
 
题目描述 Description

所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子:

43#9865#045
    +    8468#6633
       44445506978

其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5。

现在,我们对问题做两个限制:

首先,我们只考虑加法的虫食算。这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0。

其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。如果这个算式是N进制的,我们就取英文字母表午的前N个大写字母来表示这个算式中的0到N-1这N个不同的数字:但是这N个字母并不一定顺序地代表0到N-1)。输入数据保证N个字母分别至少出现一次。

BADC
      +    CBDA
            DCCC

上面的算式是一个4进制的算式。很显然,我们只要让ABCD分别代表0123,便可以让这个式子成立了。你的任务是,对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立。输入数据保证有且仅有一组解,

输入描述 Input Description

输入包含4行。第一行有一个正整数N(N<=26),后面的3行每行有一个由大写字母组成的字符串,分别代表两个加数以及和。这3个字符串左右两端都没有空格,从高位到低位,并且恰好有N位。

输出描述 Output Description

输出包含一行。在这一行中,应当包含唯一的那组解。解是这样表示的:输出N个数字,分别表示A,B,C……所代表的数字,相邻的两个数字用一个空格隔开,不能有多余的空格。

样例输入 Sample Input

5
ABCED
BDACE
EBBAA

样例输出 Sample Output

1 0 3 4 2

数据范围及提示 Data Size & Hint

对于30%的数据,保证有N<=10;
对于50%的数据,保证有N<=15;
对于全部的数据,保证有N<=26。

 
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<ctime>
  5. #include<algorithm>
  6. #include<map>
  7.  
  8. using namespace std;
  9. int n,cnt;
  10. map<char,int>m;
  11. char ch[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
  12. char s1[],s2[],s3[];
  13. int a[],b[],c[],d[];
  14.  
  15. bool check()
  16. {
  17. int tmp=;
  18. for(int i=n-;i>=;i--)
  19. {
  20. c[i]=(m[s1[i]]+m[s2[i]]+tmp)%n;
  21. tmp=(m[s1[i]]+m[s2[i]]+tmp);
  22. tmp/=n;
  23. if(c[i]!=m[s3[i]]) return false;
  24. }
  25. return true;
  26. }
  27.  
  28. int main()
  29. {
  30. scanf("%d",&n);
  31. scanf("%s",s1);scanf("%s",s2);scanf("%s",s3);
  32. for(int i=;i<n;i++) a[i]=i;
  33. while(++cnt)
  34. {
  35. if(cnt>) break;
  36. random_shuffle(a,a+n);
  37. for(int i=;i<n;i++) m[ch[i]]=a[i];
  38. if(check()) break;
  39. }
  40.  
  41. for(int i=;i<n;i++) printf("%d ",m[ch[i]]);
  42. return ;
  43. }

嗯...随机化30分

 
  1. /*
  2. 嗯...倒着搜,一列一列的搜
  3. 边搜边剪枝。
  4. */
  5. #include<iostream>
  6. #include<cstdio>
  7. #include<cstring>
  8. #include<cstdlib>
  9.  
  10. #define N 27
  11.  
  12. using namespace std;
  13. int n,m,ans,cnt,tmp;
  14. char s1[N],s2[N],s3[N];
  15. int match[N];
  16. bool vis[N];
  17.  
  18. void dfs(int use,bool flag=false)
  19. {
  20. if(use==n)
  21. {
  22. if(!flag)
  23. {
  24. for(int i=;i<n;i++) printf("%d ",match[i]);
  25. exit();
  26. }
  27. else return;
  28. }
  29.  
  30. for(int k=n--use;k>=;k--)
  31. if(match[s1[k]]!=- && match[s2[k]]!=- && match[s3[k]]!=-
  32. && (match[s1[k]]+match[s2[k]])%n!=match[s3[k]]
  33. && (+match[s1[k]]+match[s2[k]])%n!=match[s3[k]]) return;
  34.  
  35. int tmp=n--use;
  36. if(match[s1[tmp]]==-)
  37. {
  38. for(int k=n-;k>=;k--)
  39. {
  40. if(!vis[k])
  41. {
  42. vis[k]=;match[s1[tmp]]=k;
  43. dfs(use,flag);
  44. vis[k]=;match[s1[tmp]]=-;
  45. }
  46. }
  47. }
  48. else if(match[s2[tmp]]==-)
  49. {
  50. for(int k=n-;k>=;k--)
  51. {
  52. if(!vis[k])
  53. {
  54. vis[k]=;match[s2[tmp]]=k;
  55. dfs(use,flag);
  56. vis[k]=;match[s2[tmp]]=-;
  57. }
  58. }
  59. }
  60. else if(match[s3[tmp]]==-)
  61. {
  62. int pre=match[s1[tmp]]+match[s2[tmp]]+flag;
  63. for(int k=;k<n;k++)
  64. if(match[k]==pre%n) return;
  65. match[s3[tmp]]=pre%n;
  66. vis[match[s3[tmp]]]=;
  67. dfs(use+,pre>=n);
  68. vis[match[s3[tmp]]]=;
  69. match[s3[tmp]]=-;
  70. }
  71. else
  72. {
  73. int pre=match[s1[tmp]]+match[s2[tmp]]+flag;
  74. if(match[s3[tmp]]==pre%n) dfs(use+,pre>=n);
  75. }
  76.  
  77. }
  78.  
  79. int main()
  80. {
  81. scanf("%d%s%s%s",&n,s1,s2,s3);
  82. for(int i=;i<n;i++)
  83. {
  84. match[i]=-;
  85. s1[i]-='A';s2[i]-='A';s3[i]-='A';
  86. }dfs();
  87. return ;
  88. }

虫食算 2004年NOIP全国联赛提高组(dfs)的更多相关文章

  1. Codevs 1064 虫食算 2004年NOIP全国联赛提高组

    1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所谓虫食算,就是原先的算式 ...

  2. codevs 1058 合唱队形 2004年NOIP全国联赛提高组

    1058 合唱队形 2004年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description N位同学站成一排,音 ...

  3. 1058 合唱队形 2004年NOIP全国联赛提高组

    1058 合唱队形 2004年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descripti ...

  4. 【CodeVS】【2004年NOIP全国联赛提高组】1057 津津的储蓄计划

    1057 津津的储蓄计划 2004年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题目描述 Description 津津的零花钱一直都是 ...

  5. 津津的储蓄计划 2004年NOIP全国联赛提高组

    题目描述 Description 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄,妈妈提出,津津可以 ...

  6. codevs 1057 津津的储蓄计划 2004年NOIP全国联赛提高组 x

     时间限制: 1 s  空间限制: 128000 KB   题目描述 Description 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花 ...

  7. Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组

    1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description S 城现有两座监狱,一共 ...

  8. Codevs 1218 疫情控制 2012年NOIP全国联赛提高组

    1218 疫情控制 2012年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description H 国有 n 个城市,这 ...

  9. Codevs 3289 花匠 2013年NOIP全国联赛提高组

    3289 花匠 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 花匠栋栋种了一排花,每株花都 ...

随机推荐

  1. dorado 7 使用总结

    最近项目上需要,使用了dorado 7 ,总体感觉还可以,快速开发很方便,然而在方便的同时,难免有些太过繁琐,很多东西都封装了起来,会造成很多不便.因此快速开发的项目可以使用,其它的不推荐.现在打算将 ...

  2. 03匿名内部类、eclipse快捷键、String相关知识

    03匿名内部类.eclipse快捷键.String相关知识-2018.7.11 1.匿名内部类(只针对重写一个方法时候使用,不能向下转型,因为没有子类类名) new Inter(){ public v ...

  3. C++关键字:explicit

    #include "pch.h" #include <iostream> using namespace std; class BaseClass { public: ...

  4. 爬虫实战(二) 用Python爬取网易云歌单

    最近,博主喜欢上了听歌,但是又苦于找不到好音乐,于是就打算到网易云的歌单中逛逛 本着 "用技术改变生活" 的想法,于是便想着写一个爬虫爬取网易云的歌单,并按播放量自动进行排序 这篇 ...

  5. Linux命令学习(2): scp和rsync基本用法与断点续传

    版权声明:本文为博主原创文章,未经允许不得转载. 引子 在平常的工作中,我经常需要在远程服务器和本地之间传输文件. 以前我都使用scp命令,直到今天因为网络中断,scp出现了stalled. 因为上传 ...

  6. Datatable 导出到execl 官网demo

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content ...

  7. 洛谷 2633 BZOJ 2588 Spoj 10628. Count on a tree

    [题解] 蜜汁强制在线... 每个点开一个从它到根的可持久化权值线段树.查询的时候利用差分的思想在树上左右横跳就好了. #include<cstdio> #include<algor ...

  8. 3.8.5 多重选择:switch语句

        在处理多个选项时,使用if/else结构显得有些笨拙.               Scanner in = new Scanner(System.in);             Syste ...

  9. jetty添加容器容器提供包

    在tomcat的使用中,我们常常会吧容器提供的包放入:TOMCAT_HOME\lib下, 比如mysql-connection-java-version.jar 在使用jetty容器的时候,若要让容器 ...

  10. nyoj 4 ASCII码排序(set,multiset)

    ASCII码排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符.   输入 第一行输 ...