HDU 5612 Baby Ming and Matrix games
暴力搜索,据说精度卡的紧。。。但我是double过了的。
#include<cstdio> #include<cstring> #include<vector> #include<cmath> #include<queue> #include<list> #include<algorithm> using namespace std; const double eps=1e-8; int dir[4][2],t[4][2]; double a[100][100]; bool flag[100][100]; char s[100][100]; int n,m; double sum; bool ans; double path[1000]; void init() { dir[0][0]=2; dir[0][1]=0; dir[1][0]=-2; dir[1][1]=0; dir[2][0]=0; dir[2][1]=2; dir[3][0]=0; dir[3][1]=-2; t[0][0]=1; t[0][1]=0; t[1][0]=-1; t[1][1]=0; t[2][0]=0; t[2][1]=1; t[3][0]=0; t[3][1]=-1; for(int i=0;i<n;i++) for(int j=0;j<m;j++) a[i][j]=-1.0; for(int i=0; i<n; i++) for(int j=0; j<m; j++) if(s[i][j]>='0'&&s[i][j]<='9') a[i][j]=1.0*(s[i][j]-'0'); memset(flag,0,sizeof flag); } void dfs(double nowNum,int nowx,int nowy,int tot) { if(fabs(nowNum-sum)<eps) { ans=1; return; } for(int i=0; i<4; i++) { double newNum; int newX,newY; newX=nowx+dir[i][0]; newY=nowy+dir[i][1]; if(newX>=0&&newX<n) { if(newY>=0&&newY<m) { if(flag[newX][newY]==0) { flag[newX][newY]=1; if(s[nowx+t[i][0]][nowy+t[i][1]]=='+') { newNum=nowNum+a[newX][newY]; dfs(newNum,newX,newY,tot+1); if(ans) return; } else if(s[nowx+t[i][0]][nowy+t[i][1]]=='-') { newNum=nowNum-a[newX][newY]; dfs(newNum,newX,newY,tot+1); if(ans) return; } else if(s[nowx+t[i][0]][nowy+t[i][1]]=='*') { newNum=nowNum*a[newX][newY]; dfs(newNum,newX,newY,tot+1); if(ans) return; } else if(s[nowx+t[i][0]][nowy+t[i][1]]=='/') { if(fabs(a[newX][newY]-0.0)<eps) { flag[newX][newY]=0;continue; } newNum=nowNum/a[newX][newY]; dfs(newNum,newX,newY,tot+1); if(ans) return; } flag[newX][newY]=0; } } } } } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d%lf",&n,&m,&sum); for(int i=0; i<n; i++) scanf("%s",s[i]); init(); ans=0; for(int i=0; i<n; i++) for(int j=0; j<m; j++) if(a[i][j]>=0) { memset(flag,0,sizeof flag); flag[i][j]=1; dfs(a[i][j],i,j,1); if(ans) break; } if(ans) printf("Possible\n"); else printf("Impossible\n"); } return 0; }