虫食算 2004年NOIP全国联赛提高组(dfs)
所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子:
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个不同的字母分别代表的数字,使得该加法算式成立。输入数据保证有且仅有一组解,
输入包含4行。第一行有一个正整数N(N<=26),后面的3行每行有一个由大写字母组成的字符串,分别代表两个加数以及和。这3个字符串左右两端都没有空格,从高位到低位,并且恰好有N位。
输出包含一行。在这一行中,应当包含唯一的那组解。解是这样表示的:输出N个数字,分别表示A,B,C……所代表的数字,相邻的两个数字用一个空格隔开,不能有多余的空格。
5
ABCED
BDACE
EBBAA
1 0 3 4 2
对于30%的数据,保证有N<=10;
对于50%的数据,保证有N<=15;
对于全部的数据,保证有N<=26。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<map> using namespace std;
int n,cnt;
map<char,int>m;
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'};
char s1[],s2[],s3[];
int a[],b[],c[],d[]; bool check()
{
int tmp=;
for(int i=n-;i>=;i--)
{
c[i]=(m[s1[i]]+m[s2[i]]+tmp)%n;
tmp=(m[s1[i]]+m[s2[i]]+tmp);
tmp/=n;
if(c[i]!=m[s3[i]]) return false;
}
return true;
} int main()
{
scanf("%d",&n);
scanf("%s",s1);scanf("%s",s2);scanf("%s",s3);
for(int i=;i<n;i++) a[i]=i;
while(++cnt)
{
if(cnt>) break;
random_shuffle(a,a+n);
for(int i=;i<n;i++) m[ch[i]]=a[i];
if(check()) break;
} for(int i=;i<n;i++) printf("%d ",m[ch[i]]);
return ;
}
嗯...随机化30分
/*
嗯...倒着搜,一列一列的搜
边搜边剪枝。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib> #define N 27 using namespace std;
int n,m,ans,cnt,tmp;
char s1[N],s2[N],s3[N];
int match[N];
bool vis[N]; void dfs(int use,bool flag=false)
{
if(use==n)
{
if(!flag)
{
for(int i=;i<n;i++) printf("%d ",match[i]);
exit();
}
else return;
} for(int k=n--use;k>=;k--)
if(match[s1[k]]!=- && match[s2[k]]!=- && match[s3[k]]!=-
&& (match[s1[k]]+match[s2[k]])%n!=match[s3[k]]
&& (+match[s1[k]]+match[s2[k]])%n!=match[s3[k]]) return; int tmp=n--use;
if(match[s1[tmp]]==-)
{
for(int k=n-;k>=;k--)
{
if(!vis[k])
{
vis[k]=;match[s1[tmp]]=k;
dfs(use,flag);
vis[k]=;match[s1[tmp]]=-;
}
}
}
else if(match[s2[tmp]]==-)
{
for(int k=n-;k>=;k--)
{
if(!vis[k])
{
vis[k]=;match[s2[tmp]]=k;
dfs(use,flag);
vis[k]=;match[s2[tmp]]=-;
}
}
}
else if(match[s3[tmp]]==-)
{
int pre=match[s1[tmp]]+match[s2[tmp]]+flag;
for(int k=;k<n;k++)
if(match[k]==pre%n) return;
match[s3[tmp]]=pre%n;
vis[match[s3[tmp]]]=;
dfs(use+,pre>=n);
vis[match[s3[tmp]]]=;
match[s3[tmp]]=-;
}
else
{
int pre=match[s1[tmp]]+match[s2[tmp]]+flag;
if(match[s3[tmp]]==pre%n) dfs(use+,pre>=n);
} } int main()
{
scanf("%d%s%s%s",&n,s1,s2,s3);
for(int i=;i<n;i++)
{
match[i]=-;
s1[i]-='A';s2[i]-='A';s3[i]-='A';
}dfs();
return ;
}
虫食算 2004年NOIP全国联赛提高组(dfs)的更多相关文章
- Codevs 1064 虫食算 2004年NOIP全国联赛提高组
		
1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所谓虫食算,就是原先的算式 ...
 - codevs 1058 合唱队形  2004年NOIP全国联赛提高组
		
1058 合唱队形 2004年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description N位同学站成一排,音 ...
 - 1058 合唱队形  2004年NOIP全国联赛提高组
		
1058 合唱队形 2004年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descripti ...
 - 【CodeVS】【2004年NOIP全国联赛提高组】1057 津津的储蓄计划
		
1057 津津的储蓄计划 2004年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题目描述 Description 津津的零花钱一直都是 ...
 - 津津的储蓄计划  2004年NOIP全国联赛提高组
		
题目描述 Description 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄,妈妈提出,津津可以 ...
 - codevs 1057 津津的储蓄计划  2004年NOIP全国联赛提高组 x
		
时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花 ...
 - Codevs 1069 关押罪犯  2010年NOIP全国联赛提高组
		
1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description S 城现有两座监狱,一共 ...
 - Codevs 1218 疫情控制  2012年NOIP全国联赛提高组
		
1218 疫情控制 2012年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description H 国有 n 个城市,这 ...
 - Codevs 3289 花匠  2013年NOIP全国联赛提高组
		
3289 花匠 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 花匠栋栋种了一排花,每株花都 ...
 
随机推荐
- vue 使用vue-i18n做全局中英文切换
			
1.vue-i18n安装 npm install vue-i18n --save-dev 2.在main.js文件中引入 import VueI18n from 'vue-i18n'; Vue.use ...
 - python_ 学习笔记(hello world)
			
python中的循环语句 循环语句均可以尾随一个else语句块,该块再条件为false后执行一次 如果使用break跳出则不执行. for it in [1,2,3,4]: print(it,end= ...
 - 洛谷 2146 [NOI2015]软件包管理器
			
[题解] 每个软件只依赖另一个软件,且依赖关系不构成环,那么很容易想到这是树形结构. 我们用1表示以安装,用0表示未安装或已卸载:那么安装一个软件,就是把它到树根的路径上所有的点都改为1:卸载一个软件 ...
 - 在此计算机中仅有部分visual studio2010产品已升级到SP1,只有全部升级,产品才能正常运行
			
先说废话: 本人机子刚装系统Win10 专业版 1709 开始安装vs2010的时候中途报错了,有一个什么驱动不兼容,被我给关闭了,继续安装完,然后找不到vs的启动快捷方式,开始里面没有,于是我开始修 ...
 - 【Codeforces 1063B】Labyrinth
			
[链接] 我是链接,点我呀:) [题意] 你可以往左最多x次,往右最多y次 问你从x,y出发最多能到达多少个格子 只能往上下左右四个方向走到没有障碍的格子 [题解] 假设我们从(r,c)出发想要到固定 ...
 - Netty学习总结(4)——图解Netty之Pipeline、channel、Context之间的数据流向
			
以下所绘制图形均基于Netty4.0.28版本. 一.connect(outbound类型事件) 当用户调用channel的connect时,会发起一个outbound类型的事件,该事件将在pipel ...
 - 总结懒加载的解决方法(全)org.hibernate.LazyInitializationException: could not initialize proxy - no Session
			
如下错误:org.hibernate.LazyInitializationException: could not initialize proxy - no Session 原因是懒加载的问题,因为 ...
 - HDU A/B 扩展欧几里得
			
Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). Input 数据的 ...
 - windows 2008 64位在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配
			
在本机32位环境中使用access数据库正常. 公布到server上时提示:在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配 server是64位环境.windows 2008,64位的t ...
 - Scala入门到精通——第十五节  Case Class与模式匹配(二)
			
本节主要内容 模式匹配的类型 for控制结构中的模式匹配 option类型模式匹配 1. 模式的类型 1 常量模式 object ConstantPattern{ def main(args: Arr ...