UVA - 185 Roman Numerals

题目链接

思路:

剪枝、回溯

注意回溯的时候,是从当前点的下一个开始,而不是从已经遍历的个数点开始!!不然回溯有问题!

思路参考自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 }

猜你喜欢

转载自www.cnblogs.com/zhuixunfighting/p/10045245.html