原题地址: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. hdu 4745 Two Rabbits

    思路:求最长回文子串的长度!代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #incl ...

  2. 自制 JS.format带分页索引

    //第一参数是:Json对象,第二个是   序号  第三个   页数     第四  当前页数String.prototype.format = function (args, sid, pagesi ...

  3. poj 3114(强连通缩点+SPFA)

    题目链接:http://poj.org/problem?id=3114 思路:题目要求很简单,就是求两点之间的花费的最短时间,不过有一个要求:如果这两个city属于同一个国家,则花费时间为0.如何判断 ...

  4. lintcode:买卖股票的最佳时机 IV

    买卖股票的最佳时机 IV 假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格. 设计一个算法来找到最大的利润.你最多可以完成 k 笔交易. 注意事项 你不可以同时参与多笔交易(你必须在再次 ...

  5. kill -9 和kill

    kill pid 在kill进程的同时,会将包删掉该进程所在webapps目录下的文件夹,如iexpense文件夹 kill -9 pid 会强制删掉进程,但是不是删掉该进程所在webapps目录下的 ...

  6. SWD应用接口

    随着ARM公司对Cortex系列的推出,采样SWD方式调试成了大家的首选.SWD不仅速度可以与JTAG媲美,而且使用的调试线少得多.很多人在采样SWD方式进行调试时,一般都是采用4线: ① VCC   ...

  7. 关于html5与jsp页面同样的html代码展示的页面效果不一样的问题

    原文:关于html5与jsp页面同样的html代码展示的页面效果不一样的问题 html5默认的声明为 <!DOCTYPE html> jsp默认的声明头部为 <%@ page con ...

  8. swift:入门知识之泛型

    在尖括号里写一个名字来创建一个泛型函数或者类型 例如<T>.<Type> 可以创建泛型类.枚举和结构体 在类型后使用where来指定一个需求列表.例如,要限定实现一个协议的类型 ...

  9. 常用加密算法的Java实现总结

    常用加密算法的Java实现(一) ——单向加密算法MD5和SHA 1.Java的安全体系架构 1.1           Java的安全体系架构介绍 Java中为安全框架提供类和接口.JDK 安全 A ...

  10. Hadoop2.2.0 安装笔记

    在Youtube上找到靠谱的教程:http://www.youtube.com/watch?v=WN2tJk_oL6E 同时把作者的教程下载下来放在百度云盘上了:http://pan.baidu.co ...