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

  • 相关阅读:
    POJ 2175 Evacuation Plan 费用流 负圈定理
    POJ 2983 Is the Information Reliable? 差分约束
    codeforces 420B Online Meeting
    POJ 3181 Dollar Dayz DP
    POJ Ant Counting DP
    POJ 1742 Coins DP 01背包
    中国儒学史
    产品思维30讲
    Java多线程编程核心技术
    编写高质量代码:改善Java程序的151个建议
  • 原文地址:https://www.cnblogs.com/Griselda/p/2755886.html
Copyright © 2011-2022 走看看