题目
思路
从bfs的思路出发,到达每个柱子最小的次数能确定,但当按柱子进行bfs很容易就t了,进一步观察,发现其实不仅是柱子,柱子所在的那一行或列也是确定的,那么对行,列,作为bfs的单位,用数组元素代表行或列,就可以在规定时间内完成
AC代码
#include <iostream>
#include <queue>
using namespace std;
char p[1005][1005]={0};
int x[1005]={0};
int y[1005]={0};
typedef struct xy
{
int x,y;
}xy;
queue<xy> lis;
int main()
{
int n,m;scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
char ch=0;
while(ch!='.'&&ch!='#') ch=getchar();
p[i][j]=ch;
}
}
for(int i=1;i<=n;i++) x[i]=INT_MAX;
for(int i=1;i<=m;i++) y[i]=INT_MAX;
x[n]=0;
for(int j=1;j<=m;j++)
{
if(p[n][j]=='#')
{
xy tem;
tem.x=n,tem.y=j;
lis.push(tem);
}
}
while(!lis.empty())
{
xy tem=lis.front();
lis.pop();
if(x[tem.x]==INT_MAX&&y[tem.y]!=INT_MAX)
{
x[tem.x]=y[tem.y]+1;
for(int i=1;i<=m;i++)
{
if(p[tem.x][i]=='#')
{
xy tem2;
tem2.x=tem.x,tem2.y=i;
lis.push(tem2);
}
}
}
if(x[tem.x]!=INT_MAX&&y[tem.y]==INT_MAX)
{
y[tem.y]=x[tem.x]+1;
for(int i=1;i<=n;i++)
{
if(p[i][tem.y]=='#')
{
xy tem2;
tem2.x=i,tem2.y=tem.y;
lis.push(tem2);
}
}
}
}
if(x[1]==INT_MAX)printf("-1");
else printf("%d",x[1]);
return 0;
}