这题主要是题意不好懂,读了好久并没有读懂,后来看的题解,主要是判断这个等式按照罗马的方式时候成立,
以及用数字代替等式中的字母后,时候有这样的一组或者多组成立,搜索就可以了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <set>
#include<cmath>
#include<climits>
#include<vector>
#include<cfloat>
#include<queue>
#include<cctype>
#include<cstdlib>
#define LL long long
using namespace std;
const int N=256;
const char letter[]="IXCMVLD";
string num[3];
int vis[N];
map<char,int> mp;
map<char,int> mp2;
map<char,int> head;
int cnt;
int size;
void table()
{
mp['I']=1;
mp['X']=10;
mp['C']=100;
mp['M']=1000;
mp['V']=5;
mp['L']=50;
mp['D']=500;
}
void init()
{
memset(vis,0,sizeof(vis));
mp2.clear();
head.clear();
for(int i=0;i<3;i++)
{
num[i]="";
}
size=0;
}
int chang(string tem)
{
int sum=0;
for(int i=0;i<tem.size()-1;i++)
{
if(mp[tem[i]]>=mp[tem[i+1]])
sum+=mp[tem[i]];
else
sum-=mp[tem[i]];
}
sum+=mp[tem[tem.size()-1]];
return sum;
}
int tran_num(string s)
{
int sum=0;
for(int i=0;i<s.size();i++)
sum=sum*10+mp2[s[i]];
return sum;
}
void dfs(int cur,int left)
{
if(cur==size)
{
if(tran_num(num[0])+tran_num(num[1])==tran_num( num[2]))
cnt++;
return;
}
for(int i=left;i<7;i++)
{
if(vis[letter[i]])
{
for(int j=0;j<=9;j++)
{
if(!vis[j])
{
if(!j&&head[letter[i]])
continue;
mp2[letter[i]]=j;
vis[i]=0;
vis[j]=1;
dfs(cur+1,i+1);
vis[i]=1;
vis[j]=0;
if(cnt>=2)
return;
}
}
}
}
}
int main()
{
string s;
table();
while(cin>>s&&s!="#")
{
init();
int flag=0;
for(int i=0;i<(int)s.length();i++)
{
if(s[i]=='+'||s[i]=='=')
{
flag++;
continue;
}
else
{
num[flag]+=s[i];
if(!vis[s[i]])
{
vis[s[i]]=1;
size++;
}
}
}
for(int i=0;i<3;i++) head[num[i][0]]=1;
if(chang(num[0])+chang(num[1])==chang(num[2]))
cout<<"Correct ";
else
cout<<"Incorrect ";
cnt=0;
dfs(0,0);
if(!cnt)
cout<<"impossible"<<endl;
else if(cnt==1)
cout<<"valid"<<endl;
else
cout<<"ambiguous"<<endl;
}
return 0;
}