UVa 185 - Roman Numerals

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=109&page=show_problem&problem=121

题目描述:(待编辑)

分析:(待编辑)

  1 #include <cstdio>
  2 #include <cstring>
  3 
  4 const int MAXN = 12;
  5 
  6 char num1[MAXN], num2[MAXN], sum[MAXN], str[100];
  7 int len1, len2, len3;
  8 int char_to_num[30];
  9 int Flag;
 10 bool visnum[30];
 11 int visch[30];
 12 int lenth;
 13 bool vis[9876543];
 14 
 15 void init()
 16 {
 17     memset(char_to_num, 0, sizeof(char_to_num) );
 18     char_to_num[ 'I' - 'A' ] = 1;
 19     char_to_num[ 'X' - 'A' ] = 10;
 20     char_to_num[ 'C' - 'A' ] = 100;
 21     char_to_num[ 'M' - 'A' ] = 1000;
 22     char_to_num[ 'V' - 'A' ] = 5;
 23     char_to_num[ 'L' - 'A' ] = 50;
 24     char_to_num[ 'D' - 'A' ] = 500;
 25     return;
 26 }
 27 
 28 void InputDeal()
 29 {
 30     int i = 0, j = 0;
 31     while ( str[i] && str[i] != '+' )
 32         num1[j++] = str[i++];
 33     num1[j] = '\0';
 34     len1 = j;
 35 
 36     j = 0;
 37     ++i;
 38     while ( str[i] && str[i] != '=' )
 39         num2[ j++ ] = str[ i++ ];
 40     num2[j] = '\0';
 41     len2 = j;
 42 
 43     j = 0;
 44     ++i;
 45     while ( str[i] )
 46         sum[j++] = str[i++];
 47     sum[j] = '\0';
 48     len3 = j;
 49     /*
 50         puts(num1);
 51         puts(num2);
 52         puts(sum);
 53     */
 54     return;
 55 }
 56 
 57 int GetNum( char *ss )
 58 {
 59     int len = strlen(ss);
 60     int number = char_to_num[ ss[len - 1] - 'A' ];
 61     for ( int i = len - 2; i >= 0; --i )
 62     {
 63         int next = char_to_num[ ss[i + 1] - 'A' ];
 64         int cur = char_to_num[ ss[i] - 'A' ];
 65         if ( cur < next ) number -= cur;
 66         else number += cur;
 67     }
 68     return number;
 69 }
 70 
 71 bool checkRoma()
 72 {
 73     int n1 = GetNum( num1 );
 74     int n2 = GetNum( num2 );
 75     int Sum = GetNum( sum );
 76 //    printf("%d %d %d\n", n1, n2, Sum );
 77     return ( ( n1 + n2 ) == Sum );
 78 }
 79 
 80 bool Judge()
 81 {
 82     if ( ( len3 > 1 && !visch[ sum[0] - 'A' ] )
 83        || ( len1 > 1 && !visch[ num1[0] - 'A' ] )
 84        || ( len2 > 1 && !visch[ num2[0] - 'A' ] ) ) return false;
 85     int n1 = 0;
 86     int n2 = 0;
 87     int Sum = 0;
 88 
 89     int i = 0;
 90     while ( num1[i] ) n1 = n1 * 10 + visch[ num1[i++] - 'A'];
 91     i = 0;
 92     while ( num2[i] ) n2 = n2 * 10 + visch[ num2[i++] - 'A'];
 93     i = 0;
 94     while ( sum[i] ) Sum =  Sum * 10 + visch[ sum[i++] - 'A'];
 95 
 96 //    if ( n1 + n2 == Sum )
 97 //    printf( "%d %d %d\n", n1, n2, Sum );
 98 
 99     return n1 + n2 == Sum;
100 }
101 
102 int GetNNN()
103 {
104     int nn = 0;
105     if ( visch['I' - 'A' ] >= 0 )
106         nn += visch['I' - 'A' ];
107     if ( visch['X' - 'A' ] >= 0 )
108         nn += visch['X' - 'A' ] * 10;
109     if ( visch['C' - 'A' ] >= 0 )
110         nn += visch['C' - 'A' ] * 100;
111     if ( visch['M' - 'A' ] >= 0 )
112         nn += visch['M' - 'A' ] * 1000;
113     if ( visch['V' - 'A' ] >= 0 )
114         nn += visch['V' - 'A' ] * 10000;
115     if ( visch['L' - 'A' ] >= 0 )
116         nn += visch['L' - 'A' ] * 100000;
117     if ( visch['D' - 'A' ] >= 0 )
118         nn += visch['D' - 'A' ] * 1000000;
119 
120     return nn;
121 }
122 
123 void DFS( int cur, char *ss )
124 {
125     if ( Flag >= 2 ) return;
126     if ( cur >= lenth )
127     {
128         int nnn = GetNNN();
129     //    printf("%d\n", nnn);
130         if ( !vis[nnn] )
131         {
132             vis[nnn] = true;
133             if ( Judge() ) ++Flag;
134         }
135         return;
136     }
137 
138     for ( int i = 0; i < 10; ++i )
139         if ( !visnum[i] )
140         {
141             visnum[i] = true;
142 
143             if ( visch[ ss[cur] - 'A' ] == -1 )
144             {
145                 visch[ ss[cur] - 'A' ] = i;
146                 DFS( cur + 1, ss );
147                 visch[ ss[cur] - 'A' ] = -1;
148             }
149             else DFS( cur + 1, ss );
150 
151             visnum[i] = false;
152 
153         }
154     return;
155 }
156 
157 int main()
158 {
159     init();
160  //   freopen( "s.out", "w", stdout );
161     while ( scanf( "%s", str ), str[0] != '#' )
162     {
163         memset( vis, false, sizeof(vis) );
164 
165         InputDeal();
166         if ( checkRoma() ) printf("Correct ");
167         else printf("Incorrect ");
168 
169         memset( visnum, false, sizeof(visnum) );
170         memset( visch, -1, sizeof(visch) );
171 
172         Flag = 0;
173 
174         strcpy( str, num1 );
175         strcat( str, num2 );
176         strcat( str, sum );
177 
178         lenth = strlen(str);
179         DFS( 0, str );
180 
181         switch(Flag)
182         {
183         case 0:
184             puts("impossible");
185             break;
186 
187         case 1:
188             puts("valid");
189             break;
190 
191         default:
192             puts("ambiguous");
193         }
194     }
195     return 0;
196 }

 

posted @ 2012-11-08 23:36  冰鸮  阅读(467)  评论(0编辑  收藏  举报