洛谷—— P1092 虫食算
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷—— P1092 虫食算相关的知识,希望对你有一定的参考价值。
https://www.luogu.org/problem/show?pid=1092
题目描述
所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子:
http://paste.ubuntu.com/25448822/
其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5。
现在,我们对问题做两个限制:
首先,我们只考虑加法的虫食算。这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0。
其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。如果这个算式是N进制的,我们就取英文字母表午的前N个大写字母来表示这个算式中的0到N-1这N个不同的数字:但是这N个字母并不一定顺序地代表0到N-1)。输入数据保证N个字母分别至少出现一次。
http://paste.ubuntu.com/25448824/
上面的算式是一个4进制的算式。很显然,我们只要让ABCD分别代表0123,便可以让这个式子成立了。你的任务是,对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立。输入数据保证有且仅有一组解
输入输出格式
输入格式:
包含四行。第一行有一个正整数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。
noip2004提高组第4题
1 #include <algorithm> 2 #include <cstring> 3 #include <cstdio> 4 #include <vector> 5 6 const int N(27); 7 bool vis[2333],use[2333]; 8 char a[N],b[N],c[N]; 9 int n,ans[2333],len; 10 std::vector<int>tmp; 11 12 bool check() 13 { 14 int tt=0,i; bool if_=0; 15 for(i=n-1; i>=0; --i) 16 { 17 char ca=a[i],cb=b[i],cc=c[i]; 18 if(ans[ca]<0 ||ans[cb]<0 ||ans[cc]<0) 19 { 20 if_=1; 21 break; 22 } 23 tt+=ans[ca]+ans[cb]; 24 if(tt%n!=ans[cc]) return false; 25 tt/=n; 26 } 27 return true; 28 } 29 void DFS(int x) 30 { 31 if(x==len) 32 { 33 for(char ch=‘A‘; ch<‘A‘+len; ++ch) 34 printf("%d ",ans[ch]); 35 std::exit(0); 36 } 37 char ch=tmp[x]; 38 for(int i=0; i<n; ++i) 39 { 40 if(use[i]) continue; 41 use[i]=1; ans[ch]=i; 42 if(check()) DFS(x+1); 43 use[i]=0; ans[ch]=-1; 44 } 45 } 46 47 int Presist() 48 { 49 scanf("%d%s%s%s",&n,a,b,c); 50 for(int i=n-1; i>=0; --i) 51 { 52 if(!vis[a[i]]) vis[a[i]]=1,tmp.push_back(a[i]); 53 if(!vis[b[i]]) vis[b[i]]=1,tmp.push_back(b[i]); 54 if(!vis[c[i]]) vis[c[i]]=1,tmp.push_back(c[i]); 55 } 56 len=tmp.size(); 57 memset(ans,-1,sizeof(ans)); 58 DFS(0); 59 return 0; 60 } 61 62 int Aptal=Presist(); 63 int main(){;}
1 #include <algorithm> 2 #include <cstring> 3 #include <cstdio> 4 #include <vector> 5 6 const int N(27); 7 bool vis[2333],use[2333]; 8 char a[N],b[N],c[N]; 9 int n,ans[2333],len; 10 std::vector<int>tmp; 11 12 bool check() 13 { 14 int tt=0,i; bool if_=0; 15 for(i=n-1; i>=0; --i) 16 { 17 char ca=a[i],cb=b[i],cc=c[i]; 18 if(ans[ca]<0 ||ans[cb]<0 ||ans[cc]<0) 19 { 20 if_=1; 21 break; 22 } 23 tt+=ans[ca]+ans[cb]; 24 if(tt%n!=ans[cc]) return false; 25 tt/=n; 26 } /*if(if_) 27 for(; i--; ) 28 { 29 char ca=a[i],cb=b[i],cc=c[i]; 30 if(ans[ca]<0 ||ans[cb]<0 ||ans[cc]<0) continue; 31 if((ans[ca]+ans[cb])%n!=ans[cc] && (ans[ca]+ans[cb]+1)%n!=ans[cc]) return false; 32 }*/ 33 return true; 34 } 35 void DFS(int x) 36 { 37 if(x==len) 38 { 39 for(char ch=‘A‘; ch<‘A‘+len; ++ch) 40 printf("%d ",ans[ch]); 41 std::exit(0); 42 } 43 char ch=tmp[x]; 44 for(int i=n-1; i>=0; --i) 45 { 46 if(use[i]) continue; 47 use[i]=1; ans[ch]=i; 48 if(check()) DFS(x+1); 49 use[i]=0; ans[ch]=-1; 50 } 51 } 52 53 int Presist() 54 { 55 scanf("%d%s%s%s",&n,a,b,c); 56 for(int i=n-1; i>=0; --i) 57 { 58 if(!vis[a[i]]) vis[a[i]]=1,tmp.push_back(a[i]); 59 if(!vis[b[i]]) vis[b[i]]=1,tmp.push_back(b[i]); 60 if(!vis[c[i]]) vis[c[i]]=1,tmp.push_back(c[i]); 61 } 62 len=tmp.size(); 63 memset(ans,-1,sizeof(ans)); 64 DFS(0); 65 return 0; 66 } 67 68 int Aptal=Presist(); 69 int main(){;}
1 #include <algorithm> 2 #include <cstring> 3 #include <cstdio> 4 #include <vector> 5 6 const int N(27); 7 bool vis[2333],use[2333]; 8 char a[N],b[N],c[N]; 9 int n,ans[2333],len; 10 std::vector<int>tmp; 11 12 bool check() 13 { 14 int tt=0,i; bool if_=0; 15 for(i=n-1; i>=0; --i) 16 { 17 char ca=a[i],cb=b[i],cc=c[i]; 18 if(ans[ca]<0 ||ans[cb]<0 ||ans[cc]<0) 19 { 20 if_=1; 21 break; 22 } 23 tt+=ans[ca]+ans[cb]; 24 if(tt%n!=ans[cc]) return false; 25 tt/=n; 26 } if(if_) 27 for(; i--; ) 28 { 29 char ca=a[i],cb=b[i],cc=c[i]; 30 if(ans[ca]<0 ||ans[cb]<0 ||ans[cc]<0) continue; 31 if((ans[ca]+ans[cb])%n!=ans[cc] && (ans[ca]+ans[cb]+1)%n!=ans[cc]) return false; 32 } 33 return true; 34 } 35 void DFS(int x) 36 { 37 if(x==len) 38 { 39 for(char ch=‘A‘; ch<‘A‘+len; ++ch) 40 printf("%d ",ans[ch]); 41 std::exit(0); 42 } 43 char ch=tmp[x]; 44 for(int i=n-1; i>=0; --i) 45 { 46 if(use[i]) continue; 47 use[i]=1; ans[ch]=i; 48 if(check()) DFS(x+1); 49 use[i]=0; ans[ch]=-1; 50 } 51 } 52 53 int Presist() 54 { 55 scanf("%d%s%s%s",&n,a,b,c); 56 for(int i=n-1; i>=0; --i) 57 { 58 if(!vis[a[i]]) vis[a[i]]=1,tmp.push_back(a[i]); 59 if(!vis[b[i]]) vis[b[i]]=1,tmp.push_back(b[i]); 60 if(!vis[c[i]]) vis[c[i]]=1,tmp.push_back(c[i]); 61 } 62 len=tmp.size(); 63 memset(ans,-1,sizeof(ans)); 64 DFS(0); 65 return 0; 66 } 67 68 int Aptal=Presist(); 69 int main(){;}
以上是关于洛谷—— P1092 虫食算的主要内容,如果未能解决你的问题,请参考以下文章