题解:题意为给出一个N*M的矩阵,然后(i∗2,j∗2) (i,j=0,1,2...)的点处是数字,两个数字之间是符号,其他位置是‘#’号。
但不知道是理解的问题还是题目描述的问题,数据中还有类似1#1这种数据存在,因此WA了4次,加上了一句代码后,马上AC了,该行代码在下文以斜粗体标出。
此外,因为里面有除法,会有一定误差,所以用这句来判断:fabs(tar-nnum)<=1e-8,而不是tar==nnum。
#include <cstdio> #include <iostream> #include <string> #include <sstream> #include <cstring> #include <stack> #include <queue> #include <algorithm> #include <cmath> #include <map> #define ms(a) memset(a,0,sizeof(a)) using namespace std; #define LOCAL char mp[120][120]; int n,m; double tar; bool flag; int dir[4][2]= {{0,2},{0,-2},{2,0},{-2,0}}; double cal(double n,double m,char c) { if(c=='+')return n+m; if(c=='-')return n-m; if(c=='*')return n*m; if(c=='/')return n/m; return 0; } void dfs(int x,int y,double num) { if(flag)return; for(int i=0; i<4; i++) { int nx=x+dir[i][0],ny=y+dir[i][1]; if(mp[nx][ny]!='#'&&(nx>=0&&nx<n&&ny>=0&&ny<m)) { char ch=mp[nx][ny]; mp[nx][ny]='#'; if(mp[x+dir[i][0]/2][y+dir[i][1]/2]=='#')return; double nnum=cal(num,ch-'0',mp[x+dir[i][0]/2][y+dir[i][1]/2]); if(fabs(tar-nnum)<=1e-8) { flag=true; return; } dfs(nx,ny,nnum); mp[nx][ny]=ch; } } return; } int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); #endif // LOCAL //Start int N; cin>>N; while(N--) { cin>>n>>m>>tar; ms(mp); flag=false; for(int i=0; i<n; i++) { cin>>mp[i]; } for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { if(isdigit(mp[i][j])) { char sav=mp[i][j]; if((sav-'0')==tar) { flag=true; break; } mp[i][j]='#'; dfs(i,j,sav-'0'); mp[i][j]=sav; } if(flag)break; } if(flag)break; } if(flag)printf("Possible "); else printf("Impossible "); } return 0; }