为什么每次跟自己说,小心点数据范围= - =却总是不尽人意...这题是个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;
}
呜呜呜,妈妈我好菜

京公网安备 11010502036488号