Digit Puzzle UVA

来源:互联网 发布:lightroom mac版下载 编辑:程序博客网 时间:2024/05/11 13:34

有点复杂的一道题目,思路如下:对需要改变的次数进行计数,得到一个当前能够改变次数的上界up,判断在up的条件下,是否能够找到一个解,满足对应的条件。利用dfs来进行搜索,按照当前搜索的串的编号、对应的编号串中的下标位置,以及当前已经改变的次数和允许改变的最大次数。如果当前改变的最大次数已经到了上限,那么就判断对应的式子是否存在唯一的解。如果由于不断地递归超出了串的个数,则直接返回,否则,判断下一次需要递归改变的位置,继续dfs求解,注意,要特判前导0的情况以及数字一致的情况,具体实现见如下代码:

#include<iostream>#include<vector>#include<string>#include<set>#include<stack>#include<queue>#include<map>#include<algorithm>#include<cmath>#include<iomanip>#include<cstring>#include<sstream>#include<cstdio>#include<deque>#include<functional>using namespace std;string s[3];int length[3];char data[] = { '*', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };int cal(){int num[3];for (int i = 0; i < 2; i++){num[i] = 0;for (int j = 0; j < length[i]; j++){num[i] = num[i] * 10 + (s[i][j] - '0');}}num[2] = num[0] * num[1];stack<char> st;if (num[2] == 0){st.push('0');}else{while (num[2]){int t = num[2] % 10;st.push(t + '0');num[2] = num[2] / 10;}}if (st.size() != length[2]) return 0;for (int i = 0; i < length[2]; i++){char temp = st.top();st.pop();if (s[2][i] == '*') continue;else if (temp != s[2][i]) return 0;}return 1;}int check(int id,int ind){int amount = 0;if (id == 2){amount = cal();return amount;}int n_id, n_ind;if (length[id] - 1 == ind){n_id = id + 1;n_ind = 0;}else{n_id = id;n_ind = ind + 1;}char temp = s[id][ind];if (s[id][ind] == '*'){for (int i = 1; i <= 10; i++){if (ind == 0 && i == 1) continue;s[id][ind] = data[i];amount += check(n_id, n_ind);if (amount > 1) break;}}else{amount += check(n_id, n_ind);}s[id][ind] = temp;return amount;}bool dfs(int id,int ind,int total,int up){if (total == up){int res = check(0, 0);if (res==1) return true;return false;}if (id == 3) return false;bool flag = false;int n_id, n_ind;char temp = s[id][ind];if (length[id] - 1 == ind){n_id = id + 1;n_ind = 0;}else{n_id = id;n_ind = ind + 1;}for (int i = 0; i < 11; i++){if (ind == 0 && i == 1) continue;if (temp == data[i]){//数字一致,不许需要更改s[id][ind] = data[i];flag = dfs(n_id, n_ind, total, up);}else{s[id][ind] = data[i];flag = dfs(n_id, n_ind, total + 1, up);}if (flag) break;}if (!flag) s[id][ind] = temp;return flag;}int main(){int c = 0;while (cin >> s[0]){c++;if (s[0] == "0") break;cin >> s[1] >> s[2];length[0] = s[0].size(), length[1] = s[1].size(), length[2] = s[2].size();for (int up = 0;; up++){if (dfs(0, 0, 0,up)){cout << "Case " << c << ": " << s[0] << " " << s[1] << " " << s[2] << endl;break;}}}return 0;}

原创粉丝点击