UVA185map的使用

来源:互联网 发布:今日特惠淘宝优站 编辑:程序博客网 时间:2024/05/16 05:45

这题主要是题意不好懂,读了好久并没有读懂,后来看的题解,主要是判断这个等式按照罗马的方式时候成立,

以及用数字代替等式中的字母后,时候有这样的一组或者多组成立,搜索就可以了。

#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 longusing 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;}


0 0
原创粉丝点击