由于数字比较少,直接暴力就可以了,还有就是要注意精度问题,好气啊啊啊~!#~·~~
#include<iostream>
#include<cstdio>
#include<string>
#include<string.h>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<iomanip>
#include<map>
#include<vector>
#include<queue>
#include<stack>
//#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int N = 1050;
const double eps =1e-9;
int dir[][2]={1,0,-1,0,0,1,0,-1};
char mp[50][50];
bool vis[50][50];
bool flag;
LL sum;
int n,m;
char fh;
void jd(int x,int y,double tmp)
{
if(fabs(tmp-sum)<=eps)
{
flag=1;
return;
}
if(flag==1)
return;
for(int i=0;i<4;++i)
{
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(vis[xx][yy]|| xx<0 ||xx>=n || yy<0 || yy>=m )
{
continue;
}
if(mp[xx][yy]!='#')
{
if(mp[xx][yy]=='+' || mp[xx][yy]=='-'|| mp[xx][yy]=='*'|| mp[xx][yy]=='/')
{
fh=mp[xx][yy];
vis[xx][yy]=1;
jd(xx,yy,tmp);
vis[xx][yy]=0;
}
else if(mp[xx][yy]>='0' || mp[xx][yy]<='9')
{
int ss=mp[xx][yy]-'0';
if(fh=='+')
{
vis[xx][yy]=1;
jd(xx,yy,tmp+ss);
vis[xx][yy]=0;
}
else if(fh=='-')
{
vis[xx][yy]=1;
jd(xx,yy,tmp-ss);
vis[xx][yy]=0;
}
else if(fh=='*')
{
vis[xx][yy]=1;
jd(xx,yy,tmp*ss);
vis[xx][yy]=0;
}
else if(fh=='/')
{
if(ss!=0)
{
vis[xx][yy]=1;
jd(xx,yy,tmp/ss);
vis[xx][yy]=0;
}
}
}
}
}
return ;
}
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%d%d%I64d",&n,&m,&sum);
for(int i=0;i<n;++i)
{
cin>>mp[i];
}
flag=0;
for(int i=0;i<n;++i)
{
for(int j=0;j<m;++j)
{
if(mp[i][j]<='9' && mp[i][j]>='0')
{
memset(vis,0,sizeof(vis));
vis[i][j]=1;
jd(i,j,mp[i][j]-'0');
if(flag==1)
break;
}
}
}
if(flag)
{
cout<<"Possible"<<endl;
}
else
{
cout<<"Impossible"<<endl;
}
}
return 0;
}
- 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
- 文章链接:http://www.carlstedt.cn/archives/81 (转载时请注明本文出处及文章链接)


发表评论
快来吐槽一下吧!