题意:
给出下式:
祥 瑞 生 辉
+ 三 羊 献 瑞
-----------------
三 羊 生 瑞 气
其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。
请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。
思路:dfs。依次深搜八个汉字代表的数字。注意不同的汉字代表的数字必须是不同得,保证数字合法的话判断两个数字的第一个数都不能是0。不检查也是正确答案。
简单的dfs,我自己写应该也写不出来。
附right代码:
1 /* 2 给出下式: 3 祥 瑞 生 辉 4 + 三 羊 献 瑞 5 ----------------- 6 三 羊 生 瑞 气 7 其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。 8 请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。 9 dfs。依次深搜八个汉字代表的数字。 10 */ 11 12 #include <stdio.h> 13 #include <string.h> 14 #include <iostream> 15 using namespace std; 16 17 //祥瑞生辉三羊献气 分别代表 a[0] - a[7] 18 19 int a[10]; 20 int ans; 21 22 bool check() { 23 for (int i=0; i<8; ++i) { 24 for (int j=0; j<8; ++j) { 25 if (a[i] == a[j] && i != j) return false; 26 } 27 } 28 return true; 29 } 30 31 void dfs(int cnt) { 32 if (cnt > 8) return; 33 if (cnt == 8) { 34 int num1 = a[0]*1000 + a[1]*100 + a[2]*10 + a[3]; 35 int num2 = a[4]*1000 + a[5]*100 + a[6]*10 + a[1]; 36 int num3 = a[4]*10000 + a[5]*1000 + a[2]*100 + a[1]*10 + a[7]; 37 //if (a[0] == 0 || a[4] == 0 || !check()) return; 38 if (!check()) return; 39 if (num3 == num1 + num2) { 40 ans = num2; 41 return; 42 } 43 } 44 for (int i=0; i<=9; ++i) { 45 a[cnt] = i; 46 dfs(cnt+1); 47 } 48 return; 49 } 50 51 int main() { 52 dfs(0); 53 cout << ans << endl; 54 return 0; 55 }