Hlg 【表达式求值+欧拉路径】.cpp

题意:

  给出一些表达式..求出表达式的和..

  然后判断这些表达式是否可以组成一串首尾相连的数字串..

  P.S. 如果有多组答案则按字典序给出..

 

思路:

  栈的应用求出表达式..

  深搜求欧拉路径..

  

Tips:

  如果有可行解则在深搜过程到尾的时候就输出~

  否则的话因为是栈的应用~可能返回的过程中会导致答案的更改..

 

Code:

View Code
  1 #include <stdio.h>
  2 #include <cstring>
  3 #include <iostream>
  4 #include <algorithm>
  5 #include <ctype.h>
  6 #include <map>
  7 using namespace std;
  8 
  9 struct Node
 10 {
 11     char arr[1024];
 12     int st;
 13     int en;
 14 }node[1024];
 15 
 16 const int MAXN = 40;
 17 int com[250][250];
 18 
 19 void ini()
 20 {
 21     memset(com, 0xff, sizeof(com));
 22     com['+']['+'] = com['+']['-'] = com['+'][')'] = com['+']['#'] = 1;
 23     com['-']['-'] = com['-']['+'] = com['-'][')'] = com['-']['#'] = 1;
 24     com['*']['+'] = com['*']['-'] = com['*']['*'] = com['*']['/'] = com['*'][')'] = com['*']['#'] = 1;
 25     com['/']['+'] = com['/']['-'] = com['/']['*'] = com['/']['/'] = com['/'][')'] = com['/']['#'] = 1;
 26     com[')']['+'] = com[')']['-'] = com[')']['*'] = com[')']['/'] = com[')'][')'] = com[')']['#'] = 1;
 27     com['('][')'] = com['#']['#'] = 0;
 28 }
 29 
 30 int change(char *&arr)
 31 {
 32     int sum = 0;
 33     while(isdigit(*arr)) {
 34         sum = sum * 10 + (*arr-'0');
 35         arr++;
 36     }
 37     return sum;
 38 }
 39 
 40 int cal(int a, char o, int b)
 41 {
 42     if(o == '+') return a+b;
 43     else if(o == '-') return a-b;
 44     else if(o == '*') return a*b;
 45     else if(o == '/') return a/b;
 46 }
 47 
 48 bool isoptr(char c) {
 49     if(c == '(' || c == '+' || c == '-' || c == '*' || c == '/' || c == ')' || c == '#') return true;
 50     else return false;
 51 }
 52 
 53 int calculate(char *arr)
 54 {
 55     char optr[MAXN];
 56     int opnd[MAXN];
 57     char c;
 58     int a, b;
 59     int top1 = 0, top2 = 0;
 60     optr[top1++] = '#';
 61     while(*arr != '#' || optr[top1-1] != '#') {
 62         if(!isoptr(*arr)) {
 63            opnd[top2++] = change(arr);
 64           // arr++;//!!!
 65         } else {
 66             c = optr[top1-1];
 67             switch(com[c][*arr]) {
 68                 case -1:
 69                     optr[top1++] = *arr;
 70                     arr++;
 71                     break;
 72                 case 0:
 73                     --top1;
 74                     arr++;
 75                     break;
 76                 case 1:
 77                     c = optr[--top1];
 78                     b = opnd[--top2];
 79                     a = opnd[--top2];
 80                     opnd[top2++] = cal(a, c, b);
 81                     break;
 82             }
 83         }
 84     }
 85     return opnd[top2-1];
 86 }
 87 
 88 bool vis[1010];
 89 int val[1010];
 90 int stack[1010], top;
 91 bool flag;
 92 int n;
 93 
 94 void dfs(int u, int tot) {
 95     if(flag)
 96         return;
 97     if(tot == n) {
 98         flag = true;
 99         for(int i = 0; i < n; ++i) {
100             printf("%d%c", val[stack[i]], i == n-1?'\n':'.');
101         }
102         return;
103     }
104     for(int i = 0; i < n; ++i)
105     if(node[u].en == node[i].st && !vis[i]) {
106         stack[top++] = i;
107         vis[i] = true;
108         dfs(i, tot+1);
109         --top;
110         vis[i] = false;
111     }
112 
113 }
114 bool cmp(Node a, Node b)
115 {
116     return strcmp(a.arr, b.arr)<=0;
117 }
118 int main()
119 {
120     int i, j, k;
121     int T;
122     char arr[100];
123     while(scanf("%d", &T) != EOF)
124     for(k = 1; k <= T; ++k) {
125         scanf("%d", &n);
126 
127         memset(vis, 0, sizeof(vis));
128         top = 0;
129         ini();
130         flag = false;
131 
132         for(i = 0; i < n; ++i) {
133             scanf("%s", arr);
134             val[i] = calculate(arr);
135         }
136 
137         printf("Case #%d:\n", k);
138         for(i = 0; i < n; ++i) {
139             sprintf(node[i].arr, "%d", val[i]);
140             node[i].st = node[i].arr[0]-'0';
141             node[i].en = val[i]%10;
142 
143         }
144 
145         sort(node, node+n, cmp);
146         for(i = 0; i < n; ++i) {
147             vis[i] = true;
148             stack[top++] = i;
149             dfs(i, 1);
150             if(flag) break;
151             vis[i] = false;
152             --top;
153         }
154 
155         if(!flag) puts("NO DIGIT SEQUENCE");
156         puts("");
157 
158     }
159     return 0;
160 }

 

 

题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1523

转载于:https://www.cnblogs.com/Griselda/archive/2012/11/05/2755886.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值