【解题报告】zju-1145 Dreisam Equations
原题地址: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的更多相关文章
- 2015 Multi-University Training Contest 6 solutions BY ZJU(部分解题报告)
官方解题报告:http://bestcoder.hdu.edu.cn/blog/2015-multi-university-training-contest-6-solutions-by-zju/ 表 ...
- zoj 2313 Chinese Girls' Amusement 解题报告
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1313 题目意思:有 N 个人(编号依次为1~N)围成一个圆圈,要求求 ...
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- 二模13day1解题报告
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
- 习题:codevs 1035 火车停留解题报告
本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...
- 习题:codevs 1519 过路费 解题报告
今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...
随机推荐
- Es使用。
http://jingyan.baidu.com/article/3052f5a1e8a06397f31f8699.html --------------------------- http://el ...
- [转载] Linux poll机制
原地址:http://hongwazi.blog.163.com/blog/#m=0&t=3&c=poll poll的是一种查询的方式,英文解释 :民意调查 函数原型:int poll ...
- poj 3159(差分约束经典题)
题目链接:http://poj.org/problem?id=3159思路:题目意思很简单,都与给定的条件dist[b]-dist[a]<=c,求dist[n]-dist[1]的最大值,显然这是 ...
- Node.js缓冲模块Buffer
前言 Javascript是为浏览器而设计的,能很好的处理unicode编码的字符串,但对于二进制或非unicode编码的数据就显得无能为力. Node.js继承Javascript的语言特性,同时又 ...
- Axis学习的第一天
下载axis的相关工程包: 选中这2个文件下载: 1)axis-bin-1.4.zip 含有axis工程包,将工程包复制到tomcat里的webapps目录下: 2)axis-src-1.4.zip ...
- three.js 简介
What is Three.js? Let's try to describe it briefly: Three.js is a library that makes WebGL - 3D in t ...
- Log4J入门教程(二) 参数讲解
继续接着Log4J入门教程(一)中的例子进行讲解,其中log4j.properties中的内容为 Log4j的三个重要组件—— Loggers, Appenders, Layouts ,这三个组 ...
- 扩展 delphi 线程 使之传递参数.(给匿名线程增加参数)
新delphi的线程TThread有了CreateAnonymousThread方法,如果再为它加一个可传递的参数不就更好了吗?代码如下: TAnonymousThreadX<T> = c ...
- MMU和TLB
MMU和TLB 记得那家芯片公司给我电话面试的时候,别的都还好,可是他问我什么是MMU,我只能干瞪眼.今天在看<Linux内核源码(陈莉君)>的时候,无意中看到第二章内存地址这一节,学习如 ...
- Netty4.x中文教程系列(一) 目录及概述
Netty4.x中文教程系列(一)目录及概述 Netty 提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. Netty是一个NIO客户端 服务端框架 ...