USACO 2.3 Zero Sum 【搜索+字符串处理+模拟计算】
题目在这:
https://www.luogu.org/problem/show?pid=1473
分析:
1、既然算式中的数字都已经帮你放好,那么我们的工作就只是在数字中插入‘+‘,’-‘,’ ‘罢了,由于符号间又有明确的优先级顺序:a_b > a+b > a-b,因此我们通过搜索来完成这个插入工作。
2、等插入好了以后,我们还应检验此式是否为零。我个人认为比较方便的办法是将数字与符号分开,再取一个数,取一个符号,进行计算。
下面是参考代码:
/* ID: linda_f1 PROG: zerosum LANG: C++ */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n; char temp[200]; bool cal(){ char stack1[200]; int stack2[200],pp = 1,p1 = 0,p2 = 0; //处理符号栈和数字栈,再一一取出计算 for(int i = 2;i < 2 * n;i += 2){ if(temp[i] == ' ') pp = 10 * pp + (temp[i+1] - '0'); else{ stack1[++p1] = temp[i]; stack2[++p2] = pp; pp = temp[i+1] - '0'; } } stack2[++p2] = pp; int a = stack2[1],b = stack2[2],ptr = 2; for(int i = 1;i <= p1;i++){ if(stack1[i] == '+'){ a += b; b = stack2[++ptr]; }else{ a -= b; b = stack2[++ptr]; } } if(!a) return true; return false; } void dfs(int p) { if(p==n) { if(cal()) { for(int i=1;i<n*2;i++) cout<<temp[i]; cout<<endl; } return ; } temp[2*p]=' '; temp[2*p+1]=(char)(p+1+48); dfs(p+1); temp[2*p]='+'; temp[2*p+1]=(char)(p+1+48); dfs(p+1); temp[2*p]='-'; temp[2*p+1]=(char)(p+1+48); dfs(p+1); } int main() { freopen("zerosum.in","r",stdin); freopen("zerosum.out","w",stdout); cin>>n; temp[1]='1'; dfs(1); return 0; }