[洛谷]P2960 [USACO09OCT]Invasion of the Milkweed G(BFS,坑点多多)

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值