UVA - 10400 Game Show Math(回溯)
2014-10-11 19:59
330 查看
题目大意:给定n个数字,问能否用一个表达式算出,目标值。其中加减乘除的优先级相同。
解析:回溯+状态重判断,可以开一个二维vis数组,其中第一维来记录位置,第二维记录sum是否出现过。然后如果sum == tar,则把当前的符号保存给一个ans数组中。
注意 -32000 <= sum <= 32000
解析:回溯+状态重判断,可以开一个二维vis数组,其中第一维来记录位置,第二维记录sum是否出现过。然后如果sum == tar,则把当前的符号保存给一个ans数组中。
注意 -32000 <= sum <= 32000
#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int N = 110; const int MAX = 32000; int tar; int num ; int vis [100000]; char path ,ans ; bool flag; int n; bool judge(int sum,int pos) { if(sum >= -MAX && sum <= MAX && !vis[pos][sum+MAX]) { return true; } return false; } void dfs(int sum,int pos) { if(pos == n) { if(sum == tar && !flag) { for(int i = 0; i <= n; i++) { ans[i] = path[i]; } flag = true; } return; } if(!flag) { //+ if(judge(sum+num[pos],pos)) { vis[pos][sum+num[pos]+MAX] = true; path[pos] = '+'; dfs(sum+num[pos],pos+1); } } if(!flag) { //- if(judge(sum-num[pos],pos)) { vis[pos][sum-num[pos]+MAX] = true; path[pos] = '-'; dfs(sum-num[pos],pos+1); } } if(!flag) { //* if(judge(sum*num[pos],pos)) { vis[pos][sum*num[pos]+MAX] = true; path[pos] = '*'; dfs(sum*num[pos],pos+1); } } if(!flag) { // % if(sum % num[pos] == 0) { if(judge(sum/num[pos],pos)) { vis[pos][sum/num[pos]+MAX] = true; path[pos] = '/'; dfs(sum/num[pos],pos+1); } } } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i = 0; i < n; i++) { scanf("%d",&num[i]); } scanf("%d",&tar); memset(vis,0,sizeof(vis)); memset(path,'=',sizeof(path)); vis[0][num[0]+MAX] = true; flag = false; dfs(num[0],1); if(flag) { for(int i = 0; i < n; i++) { printf("%d%c",num[i],ans[i+1]); } printf("%d\n",tar); }else { printf("NO EXPRESSION\n"); } } return 0; }
相关文章推荐
- uva10400 - Game Show Math(回溯+剪枝)
- uva10400 - Game Show Math(回溯+剪枝)
- uva 10400 Game Show Math
- UVa 10400 - Game Show Math
- Uva 10400 Game Show Math (DP+记录路径)
- UVA 10400 Game Show Math
- uva 10400 Game Show Math(记忆化搜索)
- Game Show Math - UVa10400 搜索
- UVA - 10400 Game Show Math
- UVA 10400 - Game Show Math
- Uva 10400 —Game Show Math(深搜+剪枝)
- uva 10400 - Game Show Math
- uva10400 Game Show Math
- UVa 10400 - Game Show Math
- UVa 10400 - Game Show Math
- UVA - 10400 Game Show Math
- uva 10400 Game Show Math
- uva 10400 - Game Show Math
- UVa 10400 - Game Show Math 游戏中的数学 dfs+判重
- uva 10400 - Game Show Math