虽然但是 为啥要剪枝才能过啊虽然但是 为啥要剪枝才能过啊虽然但是 为啥要剪枝才能过啊虽然但是 为啥要剪枝才能过啊虽然但是 为啥要剪枝才能过啊虽然但是 为啥要剪枝才能过啊
```
#include <bits/stdc++.h> using namespace std; const int N = 1010; const int mod =11451419; #define endl '\n' #define Endl '\n' #define inf 1e18 #define fast ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr); int n,m,d1[N][N],d2[N][N],dx[4]={1,-1,0,0},dy[4]={0,0,1,-1}; char g[N][N]; void bfs1(queue<pair<int,int>> q){ while(!q.empty()){ auto [x,y]=q.front(); q.pop(); for(int i=0;i<4;i++){ int a=x+dx[i],b=y+dy[i]; if(g[a][b]!='.'||d1[x][y]+1>=d2[a][b])continue; if(a>=1&&a<=n&&b>=1&&b<=m&&d1[a][b]==0x3f3f3f3f){ d1[a][b]=d1[x][y]+1; q.push({a,b}); } } } } void bfs2(queue<pair<int,int>> q){ while(!q.empty()){ auto [x,y]=q.front(); q.pop(); for(int i=0;i<4;i++){ int a=x+dx[i],b=y+dy[i]; if(g[a][b]!='.')continue; if(a>=1&&a<=n&&b>=1&&b<=m&&d2[a][b]==0x3f3f3f3f){ d2[a][b]=d2[x][y]+1; q.push({a,b}); } } } } signed main(){ int t;cin>>t; while(t--){ cin>>n>>m; queue<pair<int,int>>q1; queue<pair<int,int>>q2; memset(d1,0x3f,sizeof d1); memset(d2,0x3f,sizeof d2); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>g[i][j]; if(g[i][j]=='J')q1.push({i,j}),d1[i][j]=0; if(g[i][j]=='F')q2.push({i,j}),d2[i][j]=0; } } bfs2(q2); bfs1(q1); int ans=2e9; for(int i=1;i<=n;i++){ if(d1[i][1]<d2[i][1])ans=min(ans,d1[i][1]); if(d1[i][m]<d2[i][m])ans=min(ans,d1[i][m]); } for(int i=1;i<=m;i++){ if(d1[1][i]<d2[1][i])ans=min(ans,d1[1][i]); if(d1[n][i]<d2[n][i])ans=min(ans,d1[n][i]); } if(ans==2e9)cout<<"IMPOSSIBLE"<<endl; else cout<<ans+1<<endl; } return 0^0; }
```