题目链接:
https://vjudge.net/problem/UVA-185
思路:
剪枝、回溯
注意回溯的时候,是从当前点的下一个开始,而不是从已经遍历的个数点开始!!不然回溯有问题!
思路参考自https://blog.csdn.net/HelloWorld10086/article/details/38778361
1 #include <iostream> 2 #include<cstdio> 3 #include<map> 4 #include<set> 5 #include<cstring> 6 #include<string> 7 using namespace std; 8 map<char,int> mp,mp2; 9 string s1,s2,sum; 10 int vis[2000]; 11 int size,count=0; 12 const char letter[]="IXCMVLD"; 13 int head[2000]; 14 15 int change(string number){ 16 int ans=mp[number[number.size()-1]]; 17 for(int i=number.size()-2;i>=0;i--){ 18 if(mp[number[i]]<mp[number[i+1]]) 19 ans-=mp[number[i]]; 20 else 21 ans+=mp[number[i]]; 22 } 23 return ans; 24 } 25 int judge2(string a,string b,string c){ 26 int num1,num2,ans; 27 int tmp=1; 28 for(int i=a.size()-1;i>=0;i--){ 29 num1+=mp2[a[i]]*tmp; 30 tmp*=10; 31 } 32 } 33 int trans(string s){ 34 int tmp=1,ans=0; 35 for(int i=s.size()-1;i>=0;i--){ 36 ans+=tmp*mp2[s[i]]; 37 tmp*=10; 38 } 39 return ans; 40 } 41 void dfs(int cur,int cnt){ 42 if(cnt==size){ 43 if(trans(s1)+trans(s2)==trans(sum)) { 44 count++; 45 } 46 return; 47 } 48 if(count>1) return; 49 for(int i=cur;i<7;i++){ 50 if(vis[letter[i]]){ 51 for(int j=0;j<=9;j++){ 52 if(!vis[j]){//letter[i]<-j 53 54 if(j==0&&head[letter[i]]) 55 continue; 56 57 vis[j]=1; 58 59 mp2[letter[i]]=j;//想象成一个数组,不用再回溯 60 61 // dfs(cur+1,cnt+1); 62 dfs(i+1,cnt+1);//不是下一位,不然回溯有问题!! 63 64 vis[j]=0; 65 66 if(count>1) 67 return; 68 } 69 } 70 } 71 } 72 } 73 void init(){ 74 mp2.clear(); 75 memset(vis,0,sizeof(vis)); 76 memset(head,0,sizeof(head)); 77 size=0;count=0; 78 79 mp['I']=1;mp['X']=10;mp['C']=100;mp['M']=1000; 80 mp['V']=5;mp['L']=50;mp['D']=500; 81 } 82 int main(int argc, char** argv) { 83 string line; 84 while(cin>>line){ 85 if(line[0]=='#') break; 86 init(); 87 88 int ind1,ind2; 89 for(int i=0;i<line.size();i++){ 90 if(line[i]=='+') { 91 ind1=i; 92 s1=line.substr(0,ind1); 93 } 94 else if(line[i]=='='){ 95 ind2=i; 96 s2=line.substr(ind1+1,ind2-ind1-1); 97 } 98 else if(!vis[line[i]]){ 99 vis[line[i]]=1; 100 size++; 101 } 102 } 103 sum=line.substr(ind2+1); 104 105 head[s1[0]]=1;head[s2[0]]=1;head[sum[0]]=1; 106 107 if(change(s1)+change(s2)==change(sum)){ 108 printf("Correct "); 109 }else{ 110 printf("Incorrect "); 111 } 112 dfs(0,0); 113 if(count>1) printf("ambiguous\n"); 114 else if(count==1) printf("valid\n"); 115 else printf("impossible\n"); 116 117 } 118 return 0; 119 }