題目:uva :185 - Roman Numerals
題目大意:給出一個字符串的等式,問這個字符串是否是羅馬等式嗎?有符合的阿拉伯等式嗎?前者是就輸出correct or incorrect ,後者就得分情況:
ambiguous 能組成阿拉伯等式的字母組合大於等於2,valid 能組成阿拉伯等式的字母組合只有1種impossible 沒有符合阿拉伯等式的字母組合。解題思路:1、能不能組成羅馬等式的規則:每個當前的字母(i)的左邊的字母((i-1)所對應的值如果比i所對應的值小的話,i-1的值就取負值,否則就取正值。最後判斷是否等是式左右成立。2、能不能組成阿拉伯等式的話,就是每個字母都可以用 0 - 9 之間的數字去替代,看是否有是左右兩邊等式成立的。注意:0單獨出現,和出現前導0的情況,都是不要的,需要排除。然後相同的字母表示一樣的值。這裡就將每個字母的情況都枚舉出來,然後去掉0出現錯誤的情況,dfs()找出符合的組合。
代碼:#include#include const int N = 10; char str[N * N], s1[3][N]; int s[N * N]; char vis[N * N], head[N * N]; const char *letter = "IVXLCDM"; int count, size; void init () { s['I'] = 1; s['X'] = 10; s['C'] = 100; s['M'] = 1000; s['V'] = 5; s['L'] = 50; s['D'] = 500; size = 0; } int trans (char * a) { int num = 0, i; for (i = 1; i <= strlen (a); i++) { if (s[a[i - 1]] >= s[a[i]]) num += s[a[i- 1]]; else num -= s[a[i - 1]]; } return num; } bool is_roman () { int n1 = trans(s1[0]); int n2 = trans(s1[1]); int n3 = trans(s1[2]); if (n1 + n2 == n3) return true; return false; } int tran_num (char * a) { int num = 0; for (int i = 0; i < strlen (a); i++) num = num * 10 + s[a[i]]; return num; } void is_numerals (int n, int v) { if (n == size) { int n1 = tran_num (s1[0]); int n2 = tran_num (s1[1]); int n3 = tran_num (s1[2]); if (n1 + n2 == n3) count++; return ; } if (v >= 7) return; while(!vis[letter[v]]) v++; if (v < 7) { for (int j = 0; j < 10; j++) { if (j == 0 && head[letter[v]]) continue; s[letter[v]] = j; is_numerals (n + 1, v + 1); if (count >= 2) return; } } } int main () { int k, j; while (scanf ("%s", str) , str[0] != '#') { init(); k = j = 0; memset (vis, 0, sizeof (vis)); memset (head, 0, sizeof (head)); for (int i = 0; i < strlen (str); i++) { if (str[i] != '+' && str[i] != '=' ) { s1[k][j++] = str[i]; if (!vis[str[i]]) size++; vis[str[i]] = 1; if (j == 1) head[str[i]] = 1; } else { s1[k][j] = '\0'; k++; j = 0; } } s1[2][j] = '\0'; printf ("%s ", is_roman() ?"Correct":"Incorrect"); count = 0; is_numerals(0, 0); if (!count) printf ("impossible\n"); else { if (count == 1) printf ("valid\n"); else printf ("ambiguous\n"); } } return 0; }