传送门:
http://acm.hdu.edu.cn/showproblem.php?pid=5612
shab题,暴搜即可,由于一共最大只有15个数,所以可以强行走一条覆盖所有点的路出来,看看情况,再乘上15就ok了!!!
据题解说,当表达式矩阵为5∗9的时候,最多有1400个表达式,单组复杂度为O(14000*4),题目有精度误差,最好用分数做!!!!
code:
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cmath>
#include <set>
using namespace std;
int flag;
char mp[40][40];
bool vis[40][40];
int n,m;
__int64 gcd(__int64 a,__int64 b)
{
if(b==0) return a;
return gcd(b,a%b);
}
__int64 sum;
int dir[4][2]={
2,0,
-2,0,
0,2,
0,-2
};
void dfs(int x,int y,__int64 zi,__int64 mu)
{
if(flag==1)
return ;
if(zi!=0)
{
__int64 yue=gcd(zi,mu);
zi/=yue;
mu/=yue;
}
if(zi==0) mu=1;
if(mu==1&&zi==sum)
{
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])
continue;
int xx2=x+dir[i][0]/2;
int yy2=y+dir[i][1]/2;
if(xx>=0&&xx<n&&yy>=0&&yy<m)
{
char fu=mp[xx2][yy2];
__int64 num=mp[xx][yy]-'0';
if(fu=='/'&&num==0)
continue;
vis[xx][yy]=1;
if(fu=='/')
dfs(xx,yy,zi,mu*num);
if(fu=='*')
dfs(xx,yy,zi*num,mu);
if(fu=='+')
dfs(xx,yy,zi+mu*num,mu);
if(fu=='-')
dfs(xx,yy,zi-mu*num,mu);
vis[xx][yy]=0;
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%I64d",&n,&m,&sum);
for(int i=0;i<n;i++)
scanf("%s",mp[i]);
flag=0;
memset(vis,0,sizeof vis);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(mp[i][j]<='9'&&mp[i][j]>='0')
{
if(flag==0)
{
vis[i][j]=1;
dfs(i,j,mp[i][j]-'0',1);
vis[i][j]=0;
}
}
}
}
if(flag)
puts("Possible");
else
puts("Impossible");
}
return 0;
}