【解题报告】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算法求出来的边,其余的边都可以删掉,于是就有了这 ...
随机推荐
- java基础知识回顾之javaIO类---BufferedInputStream和BufferedOutputStream
MP3的复制过程: package com.lp.ecjtu; import java.io.BufferedInputStream; import java.io.BufferedOutputStr ...
- ESASP 业界第一个最为完善的 ASP MVC框架(待续)
EchoSong 疯狂了,竟然整ASP框架. ASP就是抛弃的孩子,没人养没人疼的, 智力.四肢不全.何谈框架?? 很多ASP的前辈们要么放弃ASP 投入 ASP.net 或者 PHP怀抱.要么直接用 ...
- poj 3537 Crosses and Crosses 博弈论
思路:每次画X之后都会形成2个子游戏,即i-3和n-i-2. 代码如下: #include<iostream> #include<cstdio> #include<cma ...
- 【转】java线程系列---Runnable和Thread的区别
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...
- Android 核心分析 之七Service深入分析
Service深入分析 上一章我们分析了Android IPC架构,知道了Android服务构建的一些基本理念和原理,本章我们将深入分析Android的服务.Android体系架构中三种意义上服务: ...
- ip地址+进程端口号+路径参数同样实现restful访问
1.ip地址+进程端口号+路径参数同样实现restful访问 2. 我:还有个问题,龙哥,ip地址+端口+路径参数,也能实现restful访问吧,:可以 我:好我:所以,我只要访问,服务器ip地址+n ...
- Linux系统PATH变量配置
alias命令用于设置命令的别名,格式为“alias 别名=命令” 例如担心复制文件时误将文件被覆盖,可以执行alias cp=" cp -i",如此一来 每次复制命令都会询问用户 ...
- Android EditText获取光标位置并插入字符删除字符
1.获取光标位置 int index = editText.getSelectionStart(); 2.在光标处插入字符 int index = editText.getSelectionStart ...
- 在VS2010中使用Git(转)
在之前的一片博客<Windows 下使用Git管理Github项目>中简单介绍了在Windows环境中使用Git管理Github项目,但是是使用命令行来进行操作的,本文将简单介绍下在VS2 ...
- 5、java反射基础
Class对象: Class对象记录了所有与类相关的信息,当类加载器从文件系统中加载.class文件到JVM中的同时会为每一个类创建一个Class对象.通过Class对象可以获取到类的属性.方法.构造 ...