hdoj--5612--Baby Ming and Matrix games(dfs)

时间:2024-09-21 23:34:20


Baby Ming and Matrix games

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 1150    Accepted Submission(s): 298

Problem Description
These few days, Baby Ming is addicted to playing a matrix game.



Given a n∗mhdoj--5612--Baby Ming and Matrix games(dfs)
matrix, the character in the matrix(i∗2,j∗2) (i,j=0,1,2...)hdoj--5612--Baby Ming and Matrix games(dfs)
are the numbers between 0−9hdoj--5612--Baby Ming and Matrix games(dfs).
There are an arithmetic sign (‘+’, ‘-‘, ‘∗hdoj--5612--Baby Ming and Matrix games(dfs)’,
‘/’) 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
sumhdoj--5612--Baby Ming and Matrix games(dfs).
(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.)
Input
In the first line contains a single positive integer
Thdoj--5612--Baby Ming and Matrix games(dfs),
indicating number of test case.



In the second line there are two odd numbers n,mhdoj--5612--Baby Ming and Matrix games(dfs),
and an integer sum(−10hdoj--5612--Baby Ming and Matrix games(dfs)18hdoj--5612--Baby Ming and Matrix games(dfs)<sum<10hdoj--5612--Baby Ming and Matrix games(dfs)18hdoj--5612--Baby Ming and Matrix games(dfs)hdoj--5612--Baby Ming and Matrix games(dfs),
divisor 0 is not legitimate, division rules see example)



In the next nhdoj--5612--Baby Ming and Matrix games(dfs)
lines, each line input mhdoj--5612--Baby Ming and Matrix games(dfs)
characters, indicating the matrix. (The number of numbers in the matrix is less than
15hdoj--5612--Baby Ming and Matrix games(dfs))



1≤T≤1000hdoj--5612--Baby Ming and Matrix games(dfs)
Output
Print Possible if it is possible to find such an expressions.



Print Impossible if it is impossible to find such an expressions.
Sample Input
3
3 3 24
1*1
+#*
2*8
1 1 1
1
3 3 3
1*0
/#*
2*6
Sample Output
Possible
Possible
Possible
Hint
The first sample:1+2*8=24
The third sample:1/2*6=3
Source
Recommend
hujie   |   We have carefully selected several similar problems for you:  5639 5638 5637 5636 5635 

传递的参数都是整数,如果遇到比较大的分母可能表达式的值为0,所以传递的b表示分母,遇到除法就把数乘到分母上,加法或者减法就乘以分母然后加减到分子上,最后判断的时候看是否等于sum*b
#include<cstdio>
#include<queue>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int dx[4]={2,-2,0,0};
int dy[4]={0,0,2,-2};
char str[50][50];
bool flag;
int vis[50][50],n,m;
__int64 sum;
bool judge(int x,int y)
{
return x>=0&&x<n&&y>=0&&y<m;
}
void dfs(int x,int y,__int64 a,__int64 b)
{
if(flag) return ;
if(a==b*sum)
{
flag=true;
return;
}
for(int i=0;i<4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(!judge(xx,yy)||vis[xx][yy]||str[xx][yy]<'0'||str[xx][yy]>'9'||str[xx][yy]=='#')
continue;
__int64 v=str[xx][yy]-'0';
int mx=(x+xx)>>1;
int my=(y+yy)>>1;
__int64 aa=a,bb=b;
if(str[mx][my]=='/'&&v==0) continue;
vis[xx][yy]=1;
if(str[mx][my]=='*'){aa*=v;}
else if(str[mx][my]=='/'){bb*=v;}
else if(str[mx][my]=='+') {aa+=bb*v;}
else {aa-=bb*v;}
dfs(xx,yy,aa,bb);
vis[xx][yy]=0;
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%d%d",&n,&m);
scanf("%I64d",&sum);
flag=false;
memset(str,'\0',sizeof(str));
for(int i=0;i<n;i++)
scanf("%s",str[i]);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(str[i][j]<='9'&&str[i][j]>='0')
{
memset(vis,0,sizeof(vis));
vis[i][j]=1;
__int64 val=str[i][j]-'0';
dfs(i,j,val,1);
if(flag) break;
}
}
if(flag) break;
}
printf(flag?"Possible\n":"Impossible\n");
}
return 0;
}