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 }

 

你可能感兴趣的:(ROM)