uva185

来源:互联网 发布:软件测试的工资待遇 编辑:程序博客网 时间:2024/06/06 17:36


//先判断给定的算式是否正确,这个首先要将罗马数字转化成阿拉伯数字

//第二就是看字母用0---9数字代入的时候算式是否成立,1有不可能成立,2只有一个可行解,3有大于等于2的可行解


#include <stdio.h>#include <string.h>#include <stdlib.h>int n,ok,final[50];int encode[]={1,5,10,50,100,500,1000},vis[50];char ss[100],code[]={"IVXLCDM"},str[50];int tonum(char *s){int i,j,temp=-1,res=0;for(i=0;i<strlen(s);i++){for(j=0;j<7;j++){if(code[j]==s[i]){if(temp==-1)res=temp=encode[j];else if(encode[j]>temp){res+=encode[j]-temp-temp;}else{res+=encode[j];temp=encode[j];}break;}}}return res;}void dfs(int x){int i,j;if(ok>1)return ;if(x==n){int x=0,y=0,sum=0;for(i=0;i<strlen(ss);i++){if(ss[i]=='+')break;for(j=0;j<n;j++)if(ss[i]==str[j])x=x*10+final[j];if(x==0)return ;}for(i=i+1;i<strlen(ss);i++){if(ss[i]=='=')break;for(j=0;j<n;j++)if(ss[i]==str[j])y=y*10+final[j];if(y==0)return ;}for(i=i+1;i<strlen(ss);i++){for(j=0;j<n;j++)if(ss[i]==str[j])sum=sum*10+final[j];if(sum==0)return ;}if(x+y==sum)ok++;return ;}for(i=0;i<=9;i++)if(!vis[i]){vis[i]=1;final[x]=i;dfs(x+1);vis[i]=0;}}main(){int i,sum,x,y,num;//freopen("D:\\u.txt","r",stdin);while(gets(ss)){if(strcmp(ss,"#")==0)break;num=x=y=sum=0;for(i=0;i<strlen(ss);i++){if(ss[i]=='+')break;str[num++]=ss[i];}str[num]='\0';x=tonum(str);num=0;for(i=i+1;i<strlen(ss);i++){if(ss[i]=='=')break;str[num++]=ss[i];}str[num]='\0';y=tonum(str);num=0;for(i=i+1;i<strlen(ss);i++)str[num++]=ss[i];str[num]='\0';sum=tonum(str);//printf("%d+%d=%d\n",x,y,sum);if(x+y==sum)printf("Correct ");else printf("Incorrect ");num=0;memset(vis,0,sizeof(vis));for(i=0;i<strlen(ss);i++){if(ss[i]=='='||ss[i]=='+')continue;if(vis[ss[i]-'A'])continue;str[num++]=ss[i];vis[ss[i]-'A']=1;}str[num]='\0';memset(vis,0,sizeof(vis));n=strlen(str);ok=0;dfs(0);if(ok>1)printf("ambiguous\n");else if(ok==1)printf("valid\n");else printf("impossible\n");}return 0;}


原创粉丝点击