为什么每次跟自己说,小心点数据范围= - =却总是不尽人意...这题是个bfs的好题(因为跟以前的bfs有很大的不同)
因为限制是2所以直接做两次bfs即可,第一次拿起点做,把可以拐一次就到的点更新,第二次拿可以拐一次就到的点做bfs,再拐一次,把拐两次可以到的点更新,最后判断更新了终点没有,更新了就输出yes/.(类似迭代加深..)
代码如下:
#include <bits/stdc++.h> using namespace std; const int N=1e3+5; int f[N][N],n,m; char a[N][N]; struct vv{ int x,y,op; }; vv start; void debug() { for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cout<<f[i][j]<<' '; } cout<<endl; }cout<<endl; } void bfs(vv lpt) { int ops=lpt.op,tx=lpt.x,ty=lpt.y,dx=tx,dy=ty; f[tx][ty]=ops; tx=dx+1,ty=dy; while(tx<=n&&a[tx][ty]!='*'&&!f[tx][ty]) { f[tx][ty]=ops,tx++;} tx=dx-1,ty=dy; while(tx>0&&a[tx][ty]!='*'&&!f[tx][ty]) { f[tx][ty]=ops,tx--;} tx=dx,ty=dy+1; while(ty<=m&&a[tx][ty]!='*'&&!f[tx][ty]) {f[tx][ty]=ops,ty++;} tx=dx,ty=dy-1; while(ty>0&&a[tx][ty]!='*'&&!f[tx][ty]) { f[tx][ty]=ops,ty--;} } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j]; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(a[i][j]=='S') { start={i,j,1}; } } } bfs(start);//更新一次. //debug(); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(f[i][j]==1) { bfs({i,j,2}); } } } //debug(); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(f[i][j]==2) { bfs({i,j,3}); } } } int flag=0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(a[i][j]=='T') { if(f[i][j]!=0) flag=1; } } } flag==1?puts("YES"):puts("NO"); return 0; }
呜呜呜,妈妈我好菜