、1:坐标是反的,(1,1)是在左下角,正常在右上角,所用建图的时候要小心
2:
加node(),搭配
中的构造
3:
不用判断位置是否越界,数组从1,1开始,最外面有一层‘0’保护,遇到了自然不符合就退出了
4:列是不确定,不是每行的列数都一样,所用上述的方法(外面还有一层‘0’)还可以少一个记录每行列数的操作。
5:不用在while循环中判断是否结束,直接统计天数,在结束后输出
ACcode:
#include<bits/stdc++.h>//万能头
using namespace std;
const int dir[8][2]{{1,0},{-1,0},{1,1},{0,1},{-1,1},{1,-1},{0,-1},{-1,-1}};//方位打表
char G[1005][1005];//存图
int g[1005][1005];//判断是否被搜索过
int ttt=0;
struct node{//构造函数
int y;//y坐标
int x;//x坐标
int t;//到达路径
node(int yy,int xx,int tt)//构造
{
y=yy;
x=xx;
t=tt;
}
};
void bfs(int y,int x)//广搜
{
queue<node> sj;//定义一个队列
sj.push(node(y,x,0));//插入第一个乳草起点
g[y][x]=true;//做标记,搜索过
while(!sj.empty())//如果队列中还有数
{
node now=sj.front();//从队首取出当前数
sj.pop();//并踢出他
ttt=now.t;//记录步数
for(int j=0;j<8;j++)//检测八个方位角
{
int ty=now.y+dir[j][1];//记录方位坐标
int tx=now.x+dir[j][0];
if(G[ty][tx]=='.'&&!g[ty][tx])//如果他没有被检测并且是草
{
g[ty][tx]=true;//侵略他
sj.push(node(ty,tx,now.t+1));//插入他
}
}
}
cout<<ttt;//如果结束了(搜索完了) 输出周数
}
int main()//主程序
{
int x,y,mx,my;
scanf("%d%d%d%d",&x,&y,&mx,&my);//输入
for(int i=y;i>=1;i--)
{
for(int j=1;j<=x;j++)
{
cin>>G[i][j];//千万不能用scanf,莫名其妙错误
}
}
bfs(my,mx);//调用函数
return 0;//完美结束
}