、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;//完美结束
}