zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    20165208 2017-2018-2 《Java程序设计》第三周学习总结
    20165208 预备作业3 Linux安装及学习
    20155315 2016-2017-2《Java程序设计》课程总结
    20155315 2016-2017-2 《Java程序设计》第十周学习总结
    20155315 2016-2017-2 《Java程序设计》第九周学习总结
    20155315 2016-2017-2 《Java程序设计》第八周学习总结
    20155315 2016-2017-2 《Java程序设计》第七周学习总结
    2017-2018-2 20165330 实验四《Android程序设计》实验报告
    第十周课堂实践总结
    2017-2018-2 20165330 实验三《敏捷开发与XP实现》实验报告
  • 原文地址:https://www.cnblogs.com/Griselda/p/2755886.html
Copyright © 2011-2022 走看看