原题地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=145

题目大意:在给定的等式右边数字之间加上加、减、乘运算符,使等式成立。

解题思路:遍历每一种情况,有计算式子的结果,若等于左边的数字,则输出答案。

题目输入的几点:

所给的式子左边是一个数字,然后是一个等号,之间可能有空格,也可能没有。然后右边的式子每两个数字之间至少有一个空格或者括号,以便区分,因此,两个数字之间可能没有空格只有括号。所以先处理右边的式子的字符串:

先定义一个新的字符串s

1.消除前置空格

2.根据字符串开头到第一个数字之间的括号数,s放入相应的前括号

3.s放入相应的数字

4.在每两个数字之间,分别计数前括号,后括号的个数,然后s依次放入对应个数的后括号、一个空格、相应的前括号

最后新的字符串s就是处理后的字符串,这个字符串满足,每两个数字之间有一个空格,且这个空格在后括号后面,前括号前面。如字符串:"(1 1)(1 1)"就会变成:"(1 1) (1 1)"在第二个“1”和第三个“1”之间有三个字符,分别是‘)’、‘ ’(空格)、‘(’。而第一个数字之前没有多余的空格,最后一个数字之后也没有多余的空格。

这样,问题就变成在给定的字符串中的空格处填入运算符,计算结果。

计算过程中用到了递归操作,每对括号内都是一个子字符串,且格式相同,将括号内的字符串进行递归可以得到整个括号内的表达式的值。

解题代码:

 #include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int q(char *s,char *send)
{
char s1[];
int ans=;
char fuhao=*(s-);
if(fuhao!='+'&&fuhao!='-'&&fuhao!='*') fuhao='+';
while(s<=send)
{
fuhao=*(s-);
if(fuhao!='+'&&fuhao!='-'&&fuhao!='*') fuhao='+';
if(*s=='(')
{
int n=;
char *ss=s;
while(n)
{
ss++;
if(*ss=='(') n++;
if(*ss==')') n--;
}
switch(fuhao)
{
case '+':ans+=q(s+,ss-);break;
case '-':ans-=q(s+,ss-);break;
case '*':ans*=q(s+,ss-);break;
}
s=ss+;
}
else
{
int as;
sscanf(s,"%[0-9]",s1);
sscanf(s1,"%d",&as);
switch(fuhao)
{
case '+':ans+=as;break;
case '-':ans-=as;break;
case '*':ans*=as;break;
}
while((*s!='+'&&*s!='-'&&*s!='*')&&s<=send) s++;
s++;
}
}
return ans;
}
char s[];
int t;
int DFS(char *ss)
{
char *sss=ss+;
if(*ss==)
{
int ans=q(s,s+strlen(s)-);
if(ans==t)
{
return ;
}
return ;
}
while(*sss!=' '&&*sss!=) sss++;
*ss='+';
if(!DFS(sss)) return ;
*ss='-';
if(!DFS(sss)) return ;
*ss='*';
if(!DFS(sss)) return ;
*ss=' ';
return ;
}
void strccc(char c[])
{
int i=,z=,k=,x=;
char s[];
s[]=;
while(c[i]==' ') i++;
while()
{
z=x=;
while(!(c[i]<=''&&c[i]>=''||c[i]==))
{
if(c[i]=='(') z++;
if(c[i]==')') x++;
i++;
}
if(c[i]==) k=;
if(x>)
while(x--) strcat(s,")");
if(k==) strcat(s," ");
if(z>)
while(z--) strcat(s,"(");
if(k==) break;
while(c[i]<=''&&c[i]>='') {int len=strlen(s);s[len]=c[i];s[len+]=;i++;}
k=;
}
strcpy(c,s);
}
int main()
{
int k=,i,j;
while(cin>>t,t)
{
while(getchar()!='=') ;
gets(s);
strccc(s);//处理
char *ss=s;
while(*ss!=' '&&*ss!=) ss++;
cout<<"Equation #"<<k++<<":"<<endl;
if(DFS(ss)) cout<<"Impossible"<<endl;
else cout<<t<<"="<<s<<endl;
cout<<endl;
}
return ;
}

【解题报告】zju-1145 Dreisam Equations的更多相关文章

  1. 2015 Multi-University Training Contest 6 solutions BY ZJU(部分解题报告)

    官方解题报告:http://bestcoder.hdu.edu.cn/blog/2015-multi-university-training-contest-6-solutions-by-zju/ 表 ...

  2. zoj 2313 Chinese Girls' Amusement 解题报告

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1313 题目意思:有 N 个人(编号依次为1~N)围成一个圆圈,要求求 ...

  3. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  4. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  5. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  6. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  7. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  8. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  9. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

随机推荐

  1. 在WCF中使用消息队列

    在一些大型的解决方案中,假设我们的服务没有办法一直在线,或者因为这样那样的原因宕机了,有没有什么办法让客户端的影响最小化呢?答案是可以通过消息队列的方式,哪怕服务是没有在线的,客户端依然可以继续操作. ...

  2. (2)在vs2010上配置opengl

    参考自http://www.yakergong.net/nehe/ 在Visual Studio 2003 中创建基于Nehe SDK的应用程序分为以下几个步骤: 创建一个空白的工程文件 包含Nehe ...

  3. 机器学习之单变量线性回归(Linear Regression with One Variable)

    1. 模型表达(Model Representation) 我们的第一个学习算法是线性回归算法,让我们通过一个例子来开始.这个例子用来预测住房价格,我们使用一个数据集,该数据集包含俄勒冈州波特兰市的住 ...

  4. 自动化 测试框架部署(python3+selenium2)

    安装Python 从https://www.python.org/downloads/下载最新版本的Python3,请注意,是3: 需要将Python的安装目录和安装目录下的Scripts文件夹添加到 ...

  5. 十佳AngularJS框架

    您是否还在烦恼如何没有困难地创建一个创新型的Web应用程序?那么一定不要错过这个集合!在本文中,小编为大家收集了十个非常棒的AngularJS框架.AngularJS框架拥有大量有用的工具和组件,可以 ...

  6. python 详解re模块

    正则表达式的元字符有. ^ $ * ? { [ ] | ( ).表示任意字符[]用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字符集,对于字符集中的字符可以理解成或的关系.^ 如果放在字 ...

  7. 【ArcEngine入门与提高】Element(元素)、Annotation(注记)旋转

    因项目需要,需要做一个旋转注记的工具.因为注记这玩意用的比较少,网上资源也很少,所以做起来相当头疼.在经过一番研究之后,终于搞清楚注记的存储原理了,原来是和Element的类似,只不过注记是要把Ele ...

  8. C 语言文件操作

    C 语言文件操作 1. 数据流:     程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流.     所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...

  9. mfc Clistctr 单元格嵌入图片(bmp)

    示例:http://download.csdn.net/detail/zahxz/4652543 代码: CListCtrl mCtrlist;//列表控件 CImageList m_ImageLis ...

  10. 在eclipse中调试web项目的时候如何把web项目分配给配置好的服务器

    举个例子,我今天在做spring和struts2整合的例子 新建项目blk 1.配置好web.xml,struts.xml,applicationContext.xml,写好jsp页面 2.把stru ...