Baby Ming and Matrix games(dfs计算表达式)
2016-03-09 09:46
127 查看
Baby Ming and Matrix games
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1210 Accepted Submission(s): 316[align=left]Problem Description[/align]
These few days, Baby Ming is addicted to playing a matrix game.
Given a n∗m matrix, the character in the matrix(i∗2,j∗2) (i,j=0,1,2...) are the numbers between 0−9. There are an arithmetic sign (‘+’, ‘-‘, ‘∗’, ‘/’) between every two adjacent numbers, other places in the matrix fill with ‘#’.
The question is whether you can find an expressions from the matrix, in order to make the result of the expressions equal to the given integer sum. (Expressions are calculated according to the order from left to right)
Get expressions by the following way: select a number as a starting point, and then selecting an adjacent digital X to make the expressions, and then, selecting the location of X for the next starting point. (The number in same place can’t be used twice.)
[align=left]Input[/align]
In the first line contains a single positive integer T, indicating number of test case.
In the second line there are two odd numbers n,m, and an integer sum(−1018<sum<1018, divisor 0 is not legitimate, division rules see example)
In the next n lines, each line input m characters, indicating the matrix. (The number of numbers in the matrix is less than 15)
1≤T≤1000
[align=left]Output[/align]
Print Possible if it is possible to find such an expressions.
Print Impossible if it is impossible to find such an expressions.
[align=left]Sample Input[/align]
3
3 3 24
1*1
+#*
2*8
1 1 1
1
3 3 3
1*0
/#*
2*6
[align=left]Sample Output[/align]
Possible
Possible
Possible
Hint
The first sample:1+2*8=24
The third sample:1/2*6=3
题解:让dfs表达式计算看能不能得到sum,必须是紧挨着的运算;
很好的一道搜索题,本来自己写了半天,各种考虑啊,然并卵,看了大神的解释,直接每次走两步就好了,那就简单多了,写了下就过了,Impossible i没大写错了一次;
发现dfs有时候真的很需要找对方法,否则麻烦还容易错;由于有除法运算,所以有误差,1e-8判断下误差;还有就是除以0的情况也考虑下;
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<map> #include<string> #include<vector> using namespace std; const int INF=0x3f3f3f3f; #define SI(x) scanf("%d",&x) #define PI(x) printf("%d",x) #define P_ printf(" ") #define mem(x,y) memset(x,y,sizeof(x)) typedef __int64 LL; const int MAXN=20; char mp[MAXN][MAXN]; int disx[4]={0,0,2,-2}; int disy[4]={2,-2,0,0}; double sum; int flot; int n,m; bool isjs(char a){ if(a=='+'||a=='-'||a=='*'||a=='/')return true; else return false; } double js(double a,char x,double b){ switch(x){ case '+':return a+b;break; case '-':return a-b;break; case '*':return a*b;break; case '/':return a/b;break; } } void dfs(int x,int y,double cur){ if(flot)return; if(abs(cur-sum)<=1e-8){ flot=1; return; } for(int i=0;i<4;i++){ int nx=x+disx[i],ny=y+disy[i]; if(nx<0||ny<0||nx>=n||ny>=m)continue; if(!isdigit(mp[nx][ny]))continue; if(!isjs(mp[x+disx[i]/2][y+disy[i]/2]))continue; char temp=mp[nx][ny]; // printf("%I64d %c %c ",cur,mp[x+disx[i]/2][y+disy[i]/2],mp[nx][ny]); // printf("%I64d\n",js(cur,mp[x+disx[i]/2][y+disy[i]/2],mp[nx][ny]-'0')); if(mp[x+disx[i]/2][y+disy[i]/2]=='/'&&mp[nx][ny]=='0')continue; double t=js(cur,mp[x+disx[i]/2][y+disy[i]/2],mp[nx][ny]-'0'); mp[nx][ny]='#'; dfs(nx,ny,t); mp[nx][ny]=temp; } } int main(){ int T; SI(T); while(T--){ scanf("%d%d%lf",&n,&m,&sum); for(int i=0;i<n;i++)scanf("%s",mp[i]); flot=0; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(isdigit(mp[i][j])){ int temp=mp[i][j]-'0'; mp[i][j]='#'; dfs(i,j,temp); mp[i][j]=temp+'0'; } } } // for(int i=0;i<n;i++)puts(mp[i]); if(flot)puts("Possible"); else puts("Impossible"); } return 0; }
相关文章推荐
- SDIO 协议分析
- poj1062
- Android编程实现根据不同日期计算天数差的方法
- mongovue模糊查询
- javascript实现动画
- 使用jvisualvm通过JMX的方式远程监控JVM的运行情况
- mac上删除占用adb端口的进程
- MFC 中配置OpenGL环境
- 经验分享:php连接oracle及thinkphp 3.2.2连接oracle
- OpenStack Liberty版本network troubleshooting
- 复利计算
- Factoring a Polynomial
- centos top 命令详解及退出top命令-使用p键及free命令
- 简单的切换代码 附控制多个切换方法
- 如何把带有文字的网址转换成%%E7%BE%8E%E5%B0%91%E5%A5%B3&
- java S2SH项目框架Struts2.3+Spring3.1+Hibernate3.6框架搭建整合以及实例demo代码分享
- 性能测试体系之测试理论和方法
- 简单讲述表关联
- PHP常量详解:define和const的区别
- 如何入门 Python 爬虫?