多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > uva 817(dfs)

uva 817(dfs)

來源:程序員人生   發布時間:2015-07-30 14:18:28 閱讀次數:2552次

題意:給出1個數字組成的字符串,然后在字符串內添加3種運算符號 * + - ,要求輸出所有添加運算符并運算后結果等于2000的式子。
所有數字不能有前導0,且式子必須是合法的。
題解:字符串長度25左右,可以暴力,用dfs搜索所有可能的分割情況,并在每次分割的字符后添加3種運算符,然后遞歸到最后1個字符拿去判斷,先用棧把所有分割字符串得到的數字壓棧,同時優先運算’*’,然后再從左到右計算看結果是不是為2000,注意2000=是IMPOSSIBLE。。。

#include <stdio.h> #include <string.h> #include <vector> #include <stack> using namespace std; const int N = 30; char str[N], s1[N], flag[3] = {'*', '+', '-'}; int res, len, s[N], pos[N]; vector<char> v[100]; bool judge(int num) { int cnt = 0, temp = 0, flag2 = 0; stack<int> sta; while (!sta.empty()) sta.pop(); for (int i = 0; i < len; i++) { temp = temp * 10 + s[i]; if (i == pos[cnt]) { if (flag2) { int aa = sta.top(); sta.pop(); aa = aa * temp; sta.push(aa); if (s1[cnt] != '*') flag2 = 0; } else if (s1[cnt] == '+' || s1[cnt] == '-') sta.push(temp); else if (s1[cnt] == '*') { sta.push(temp); flag2 = 1; } temp = 0; cnt++; } } if (flag2) { int aa = sta.top(); sta.pop(); aa = aa * temp; sta.push(aa); } else sta.push(temp); stack<int> sta2; while (!sta.empty()) { sta2.push(sta.top()); sta.pop(); } for (int i = 0; i < num; i++) { if (s1[i] != '*') { int aa = sta2.top(); sta2.pop(); int bb = sta2.top(); sta2.pop(); if (s1[i] == '-') { int cc = aa - bb; sta2.push(cc); } else { int cc = aa + bb; sta2.push(cc); } } } if (sta2.size() == 1 && sta2.top() == 2000) return true; return false; } void dfs(int cur, int num, int pre) { if (cur == len - 1) { if (judge(num)) { v[res].clear(); int cnt = 0; for (int i = 0; i < len; i++) { v[res].push_back(str[i]); if (i == pos[cnt]) v[res].push_back(s1[cnt++]); } v[res].push_back('='); res++; } return; } pos[num] = cur; for (int i = 0; i < 3; i++) { s1[num] = flag[i]; dfs(cur + 1, num + 1, cur); } pos[num] = -1; if (str[cur] == '0' && cur - pre == 1) return; dfs(cur + 1, num, pre); } int main() { int cas = 1; while (scanf("%s", str) && str[0] != '=') { memset(pos, -1, sizeof(pos)); res = 0; len = strlen(str) - 1; for (int i = 0; i < len; i++) s[i] = str[i] - '0'; printf("Problem %d ", cas++); if (strcmp(str, "2000=") == 0) { printf(" IMPOSSIBLE "); continue; } dfs(0, 0, -1); if (res == 0) printf(" IMPOSSIBLE "); else { for (int i = 0; i < res; i++) { printf(" %c", v[i][0]); for (int j = 1; j < v[i].size(); j++) printf("%c", v[i][j]); printf(" "); } } } return 0; }
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 久久99热成人精品国产 | 一二三四视频中文字幕在线看 | 国产亚洲综合久久 | 日本 免费 高清 | 波多野结中文字幕在线69视频 | 在线精品小视频 | 免费网站看v片在线观看 | 国内精品视频成人一区二区 | 久久精品一区二区三区日韩 | 精品国产精品a | 亚洲swag精品自拍一区 | 久久国产精品久久国产精品 | ww视频在线观看 | 国产高清日韩 | 综合亚洲精品一区二区三区 | 免费福利在线观看 | 午夜视频免费在线播放 | 免费一级毛片在线观看 | 欧美猛烈性xbxbxbxb | 久操精品 | 全网免费在线播放视频入口 | 欧美日在线| 羞羞动漫网页 | 日韩精品久久一区二区三区 | 亚洲精品专区一区二区欧美 | 国内精品久久久久影院亚洲 | 久草精品视频在线观看 | 亚洲 欧美 中文 日韩欧美 | 亚洲精品久久久午夜伊人 | 最近在线更新中文字幕3 | 一本久到久久亚洲综合 | 一级aaaaaa毛片免费同男同女 | 在线亚洲精品自拍 | 91精品久久久久久久久久 | 三人性free欧美高清 | 亚洲精品国产三级在线观看 | 久久国产精品亚洲一区二区 | 最近更新中文字幕7 | 三级视频网| 乱老女人一二区视频 | 手机看片福利视频 |