hdu5612 Baby Ming and Matrix games (dfs加暴力)
2016-01-26 22:52
267 查看
Baby Ming and Matrix games
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 849 Accepted Submission(s): 211
[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
题意:在这个矩阵内是否可以找到一个表达式的值等于sum;
思路:dfs找到所有的表达式,暴力一发;
AC代码:
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; double sum; int t,n,m,flag; int vis[100][100],dir[4][2]={-2,0,2,0,0,2,0,-2}; double num[100][100]; char s[100][100]; int dfs(int x,int y,double ans) { vis[x][y]=1; if(fabs(ans-sum)<=0.000000001)flag=1; for(int i=0;i<4;i++) { int fx=x+dir[i][0],fy=y+dir[i][1]; int px=x+dir[i][0]/2,py=y+dir[i][1]/2; if(fx>=1&&fx<=n&&fy<=m&&fy>=1&&vis[fx][fy]==0&&s[fx][fy]!='#') { if(s[px][py]=='+') dfs(fx,fy,ans+num[fx][fy]); else if(s[px][py]=='*') dfs(fx,fy,ans*num[fx][fy]); else if(s[px][py]=='-') dfs(fx,fy,ans-num[fx][fy]); else if(s[px][py]=='/'&&num[fx][fy]!=0) dfs(fx,fy,ans/num[fx][fy]); } } vis[x][y]=0; return 0; } int main() { scanf("%d",&t); while(t--) { flag=0; memset(vis,0,sizeof(vis)); memset(num,-1,sizeof(num)); scanf("%d%d%lf",&n,&m,&sum); for(int i=1;i<=n;i++) { scanf("%s",s[i]+1); } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(s[i][j]>='0'&&s[i][j]<='9') { num[i][j]=s[i][j]-'0'; } } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(s[i][j]>='0'&&s[i][j]<='9') { dfs(i,j,num[i][j]); } } } if(flag)printf("Possible\n"); else printf("Impossible\n"); } return 0; }
相关文章推荐
- 3DES加密算法简析
- linux性能调试----cpu篇
- C++入门小程序练习
- iptables防火墙管理详解
- XML——使用 XPath来定位信息+使用命名空间
- 九度OJ 题目1437:To Fill or Not to Fill
- 自动适配之LayoutConstriant代码适配
- leetcode 231. Power of Two
- Android Tombstone/Crash的log分析和定位
- 第一课:打开一个窗口
- vSAN 6.0设计与规模设定——混合架构与全闪存架构对比
- CentOs 基础知识
- Python List Pop
- 异常
- 关于使用memcached提高并发的文章,很有用
- 关于对大一上学期的学习总结及大一下学期的规划
- ListView 相关
- 部分函数
- python实现文本去重且不打乱原本顺序
- 洪荒或有仙——序