Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
沙发?写的累死了,dfs+各种剪枝,0ms水过#include <iostream> #include <stdio.h> #include <string.h> using namespace std; char data[30]; int romeVal[256]; int jiapos, dengpos; char *c1, *c2, *c3; int l1, l2, l3; int cnt; bool bnZero[128]; int dfs(int ws, int *val, bool *used, int carry); void init(){ romeVal['I'] = 1, romeVal['X'] = 10, romeVal['C'] = 100, romeVal['M'] = 1000; romeVal['V'] = 5, romeVal['L'] = 50, romeVal['D'] = 500; } int toRome(char *data, int len){ int sum = 0; for(int i = 0; i < len; i++){ if(i != len-1 && romeVal[(int)data[i]] < romeVal[(int)data[i+1]]){ sum -= romeVal[(int)data[i]]; } else sum += romeVal[(int)data[i]]; } return sum; } int main() { init(); while(1){ scanf("%s", data); if(data[0] == '#') break; int len = strlen(data); for(int i = 0; i < len; i++){ if(data[i] == '+'){ jiapos = i; } if(data[i] == '='){ dengpos = i; break; } } int rome1 = toRome(data, jiapos), rome2 = toRome(data+jiapos+1, dengpos-jiapos-1), rome3 = toRome(data+dengpos+1, len-dengpos-1); //cout << rome1 << " " << rome2 << " " << rome3 << endl; if(rome1 + rome2 == rome3){ printf("Correct "); } else{ printf("Incorrect "); } c1 = data, c2 = data+jiapos+1, c3 = data + dengpos +1; l1 = jiapos, l2 = dengpos-jiapos-1, l3 = len-dengpos-1; if(l1 < l2){ int temp = l1; l1 = l2; l2 = temp; char *tmp = c1; c1 = c2; c2 = tmp; } if(l3 < l1 || l3 < l2){ printf("impossible\n"); continue; } if(l3 > l1+1 && l3 > l2+1){ printf("impossible\n"); continue; } int val[128]; bool used[10] = {0}; for(int i = 'C'; i <= 'X'; i++) val[i] = -1; cnt = 0; for(int i = 'C'; i <= 'X'; i++) bnZero[i] = 0; bnZero[c1[0]] = 1, bnZero[c2[0]] = 1, bnZero[c3[0]] = 1; int res = dfs(0, val, used, 0); if(res == 0) printf("impossible\n"); if(res == 1) printf("valid\n"); if(res == 2) printf("ambiguous\n"); } return 0; } int dfs(int ws, int *val, bool *used, int carry){ if(ws == l3){ if(carry == 0) cnt ++; if(cnt > 1) return 2; return cnt; } if(ws < l2){ //此时1,2,3都在 bool cz[4]; char vr1 = c1[l1-ws-1], vr2 = c2[l2-ws-1], vr3 = c3[l3-ws-1]; int v1 = val[vr1], v2 = val[vr2], v3 = val[vr3]; cz[1] = (v1 != -1); cz[2] = (v2 != -1); cz[3] = (v3 != -1); if(cz[1] && cz[2] && cz[3]){ if((v1+v2+carry)%10==v3){ if(v1+v2+carry >= 10){ if(dfs(ws+1, val, used, 1) == 2) return 2; } else{ if(dfs(ws+1, val, used, 0) == 2) return 2; } } } else if(cz[1] && cz[2] && !cz[3]){ v3 = (v1+v2+carry)%10; bool bx = used[v3] || (v3 == 0 && bnZero[vr3]); if(!bx){ used[v3] = 1; val[vr3] = v3; int cry = (v1+v2+carry>=10) ? 1 : 0; if(dfs(ws+1, val, used, cry) == 2) return 2; val[vr3] = -1; used[v3] = 0; } } else if(cz[1] && !cz[2] && cz[3]){ v2 = (v3+20-v1-carry)%10; bool bx = used[v2] || (v2 == 0 && bnZero[vr2]); if(!bx){ used[v2] = 1; val[vr2] = v2; int cry = (v1+v2+carry>=10) ? 1 : 0; if(dfs(ws+1, val, used, cry) == 2) return 2; val[vr2] = -1; used[v2] = 0; } } else if(!cz[1] && cz[2] && cz[3]){ v1 = (v3+20-v2-carry)%10; bool bx = used[v1] || (v1 == 0 && bnZero[vr1]); if(!bx){ used[v1] = 1; val[vr1] = v1; int cry = (v1+v2+carry>=10) ? 1 : 0; if(dfs(ws+1, val, used, cry) == 2) return 2; val[vr1] = -1; used[v1] = 0; } } else if(cz[1] && !cz[2] && !cz[3]){ for(v2 = 0; v2 <= 9; v2++){ if(used[v2] || (v2 == 0 && bnZero[vr2])) continue; v3 = (v1+v2+carry)%10; bool bx = 0; if(used[v3] || (v3 == 0 && bnZero[vr3])) bx = 1; else if(v2 == v3 && vr2 != vr3) bx = 1; else if(v2 != v3 && vr2 == vr3) bx = 1; if(bx) continue; used[v2] = 1; used[v3] = 1; val[vr2] = v2; val[vr3] = v3; int cry = (v1+v2+carry>=10) ? 1 : 0; if(dfs(ws+1, val, used, cry) == 2) return 2; used[v2] = 0; used[v3] = 0; val[vr2] = -1; val[vr3] = -1; } } else if(!cz[1] && cz[2] && !cz[3]){ for(v1 = 0; v1 <= 9; v1++){ if(used[v1] || (v1 == 0 && bnZero[vr1])) continue; v3 = (v1+v2+carry)%10; bool bx = 0; if(used[v3] || (v3 == 0 && bnZero[vr3])) bx = 1; else if(v1 == v3 && vr1 != vr3) bx = 1; else if(v1 != v3 && vr1 == vr3) bx = 1; if(bx) continue; used[v1] = 1; used[v3] = 1; val[vr1] = v1; val[vr3] = v3; int cry = (v1+v2+carry>=10) ? 1 : 0; if(dfs(ws+1, val, used, cry) == 2) return 2; used[v1] = 0; used[v3] = 0; val[vr1] = -1; val[vr3] = -1; } } else if(!cz[1] && !cz[2] && cz[3]){ for(v2 = 0; v2 <= 9; v2++){ if(used[v2] || (v2 == 0 && bnZero[vr2])) continue; v1 = (v3+20-v2-carry)%10; bool bx = 0; if(used[v1] || (v1 == 0 && bnZero[vr1])) bx = 1; else if(v2 == v1 && vr2 != vr1) bx = 1; else if(v2 != v1 && vr2 == vr1) bx = 1; if(bx) continue; used[v2] = 1; used[v1] = 1; val[vr2] = v2; val[vr1] = v1; int cry = (v1+v2+carry>=10) ? 1 : 0; if(dfs(ws+1, val, used, cry) == 2) return 2; used[v2] = 0; used[v1] = 0; val[vr2] = -1; val[vr1] = -1; } } else{ for(v1 = 0; v1 <= 9; v1++){ if(used[v1] || (v1 == 0 && bnZero[vr1])) continue; for(v2 = 0; v2 <= 9; v2++){ if(used[v2] || (v2 == 0 && bnZero[vr2])) continue; v3 = (v1+v2+carry)%10; if(!used[v3] && (v3 != 0 || !bnZero[vr3])){ bool bx = 0; if(v1 == v2 && vr1 != vr2) bx = 1; else if(v1 != v2 && vr1 == vr2) bx = 1; else if(v1 == v3 && vr1 != vr3) bx = 1; else if(v1 != v3 && vr1 == vr3) bx = 1; else if(v2 == v3 && vr2 != vr3) bx = 1; else if(v2 != v3 && vr2 == vr3) bx = 1; if(bx) continue; used[v1] = 1; used[v2] = 1; used[v3] = 1; val[vr1] = v1; val[vr2] = v2; val[vr3] = v3; int cry = (v1+v2+carry>=10) ? 1 : 0; if(dfs(ws+1, val, used, cry) == 2) return 2; used[v1] = 0; used[v2] = 0; used[v3] = 0; val[vr1] = -1; val[vr2] = -1; val[vr3] = -1; } } } } } else if(ws < l1){ //只有1和3 bool cz[4]; char vr1 = c1[l1-ws-1], vr3 = c3[l3-ws-1]; int v1 = val[vr1], v3 = val[vr3]; cz[1] = (v1 != -1); cz[3] = (v3 != -1); if(cz[1] && cz[3]){ if((v1+carry)%10 == v3){ int cry = (v1+carry >= 10) ? 1 : 0; if(dfs(ws+1, val, used, cry) == 2) return 2; } } else if(cz[1] && !cz[3]){ v3 = (v1+carry)%10; bool bx = used[v3] || (v3 == 0 && bnZero[vr3]); if(!bx){ used[v3] = 1; val[vr3] = v3; int cry = (v1+carry >= 10) ? 1 : 0; if(dfs(ws+1, val, used, cry) == 2) return 2; used[v3] = 0; val[vr3] = -1; } } else if(!cz[1] && cz[3]){ v1 = (v3+10-carry)%10; bool bx = used[v1] || (v1 == 0 && bnZero[vr1]); if(!bx){ used[v1] = 1; val[vr1] = v1; int cry = (v1+carry >= 10) ? 1 : 0; if(dfs(ws+1, val, used, cry) == 2) return 2; used[v1] = 0; val[vr1] = -1; } } else{ for(v1 = 0; v1 <= 9; v1++){ if(used[v1] || (v1 == 0 && bnZero[vr1])) continue; v3 = (v1+carry)%10; bool bx = 0; if(used[v3] || (v3 == 0 && bnZero[vr3])) bx = 1; else if(v1 == v3 && vr1 != vr3) bx = 1; else if(v1 != v3 && vr1 == vr3) bx = 1; if(bx) continue; used[v1] = 1; val[vr1] = v1; used[v3] = 1; val[vr3] = v3; int cry = (v1+carry >= 10) ? 1 : 0; if(dfs(ws+1, val, used, cry) == 2) return 2; used[v1] = 0; val[vr1] = -1; used[v3] = 0; val[vr3] = -1; } } } else{ //只有3 char vr3 = c3[l3-ws-1]; int v3 = val[vr3]; if(v3 == 1 && carry == 1){ if(dfs(ws+1, val, used, 0) == 2) return 2; } if(v3 == -1 && !used[1] && carry == 1){ v3 = 1; used[1] = 1; val[vr3] = 1; if(dfs(ws+1, val, used, 0) == 2) return 2; used[1] = 0; val[vr3] = -1; } } return cnt; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator