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; 
} 
View Code

 

posted @ 2017-07-19 15:50  Captain_fcj  阅读(169)  评论(0编辑  收藏  举报