【解题报告】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算法求出来的边,其余的边都可以删掉,于是就有了这 ...
随机推荐
- 546A. Soldier and Bananas
等差数列: 以k为首相,k为公差,w个数量的和与n的大小关系 输出max(sum-0,0) Java程序 import java.util.Scanner; public class A546 ...
- angularJS之$apply()方法
这几天,根据buddy指定的任务,要分享一点angular JS的东西.对于一个在前端属于纯新手的我来说,Javascript都还是一知半解,要想直接上手angular JS,遇到的阻力还真是不少.不 ...
- React组件生命周期-正确执行运行阶段的函数
一. 二. <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=" ...
- swift:用UITabBarController、UINavigationController、模态窗口简单的搭建一个QQ界面
搭建一个QQ界面其实是一个很简单的实现,需要几种切换视图的控制器组合一起使用,即导航控制器.标签栏控制器.模态窗口.其中,将标签栏控制器设置为window的rootViewController,因为Q ...
- 笔者带你剖析淘宝TDDL(TAOBAO DISTRIBUTE DATA LAYER)
注:本文部分内容引用本人博客http://gao-xianglong.iteye.com/blog/1973591 前言 在开始讲解淘宝的TDDL(Taobao Distribute Data L ...
- 转 RMI、RPC、SOAP通信技术介绍及比对
http://www.open-open.com/home/space.php?uid=37924&do=blog&id=8974 1.RMI 使用java的程序员,对于RMI(Rem ...
- xpath选择器使用
简单说,xpath就是选择XML文件中节点的方法. 所谓节点(node),就是XML文件的最小构成单位,一共分成7种. - element(元素节点)- attribute(属性节点)- text ( ...
- Maven概要[转]
1. Maven介绍 1.1. 简介 java编写的用于构建系统的自动化工具. 目前版本是2.0.9,注意maven2和maven1有很大区别,阅读第三方文档时需要区分版本. 1.2. Maven资源 ...
- mysql高可用方案比较
详见:High Availability Database Tools http://www.acquia.com/blog/high-availability-database-tools
- 18.allegro区域约束规则设置
一.线宽和线间距 --- ---------------- 然后再电路板上创建一个区域 ----- ---- --- ---- ------------------------------