洛谷P1746-离开中山路(BFS)

简介: 洛谷P1746-离开中山路(BFS)

题目背景:


《爱与愁的故事第三弹·shopping》最终章。


题目描述:



爱与愁大神买完东西后,打算坐车离开中山路。现在爱与愁大神在x1,y1处,车站在x2,y2处。现在给出一个n×n(n<=1000)的地图,0表示马路,1表示店铺(不能从店铺穿过),爱与愁大神只能垂直或水平着在马路上行进。爱与愁大神为了节省时间,他要求最短到达目的地距离(a[i][j]距离为1)。你能帮他解决吗?


输入格式:


第1行:一个数 n

第2行~第n+1行:整个地图描述(0表示马路,1表示店铺,注意两个数之间没有空格)

第n+2行:四个数 x1,y1,x2,y2


输出格式:



只有1行:最短到达目的地距离


样例输入:


3

001

101

100

1 1 3 3


样例输出:


4


说明/提示:


20%数据:n<=100

100%数据:n<=1000


AC Code:


#include<bits/stdc++.h>
using namespace std;
#define N 1001
char s[N][N];//存入地图 
bool vis[N][N];//标记数组 
int n,sx,sy,ex,ey,head,tail;
int dx[]={0,0,1,-1};//方向数组 
int dy[]={1,-1,0,0};
struct node {//定义结构体用来模拟队列 
  int x,y,step;
}q[N*N];
bool judge(int x,int y) {//不越界,不是店铺,这个点没有走过 
  if(x>=1&&x<=n&&y>=1&&y<=n&&s[x][y]!='1'&&vis[x][y]==false) {
    return true;
  }
  return false;
}
int main() {
  memset(vis,false,sizeof(vis));//标记数组清零 
  scanf("%d",&n);
  for(int i=1;i<=n;i++) {
    for(int j=1;j<=n;j++) {
      scanf(" %c",&s[i][j]);//%前面的空格确保输入完整 
    }
  }
  scanf("%d %d %d %d",&sx,&sy,&ex,&ey);
  vis[sx][sy]=true;//标记起点 
  head=tail=1;//初始化队头队尾 
  q[head].x=sx;//起点坐标入队 
  q[head].y=sy;
  q[head].step=0;//步数初始为0 
  tail++;//起点入队之后,队尾向后移动一格 
  while(head<tail) {
    for(int i=0;i<4;i++) {//四个方向搜索 
      int tx=q[head].x+dx[i];
      int ty=q[head].y+dy[i];
      if(tx==ex&&ty==ey) {//走到终点 
        printf("%d\n",q[head].step+1);//步数=上个点步数+1 
        return 0;
      }
      if(judge(tx,ty)) {//合法判断 
        vis[tx][ty]=true;//标记这个点 
        q[tail].x=tx;//新的点入队 
        q[tail].y=ty;
        q[tail].step=q[head].step+1;//步数+1 
        tail++;//队尾后移 
      }
    }
    head++;//处理完一个点,队头向后移一格,搜索下一个点 
  }
  return 0;
}


相关文章
|
5月前
|
存储 物联网
【洛谷 P1135】奇怪的电梯 题解(广度优先搜索)
这是一个关于奇怪电梯的编程问题摘要: - 电梯在每层停,且每层有特定数字 $K_i$ 决定上/下按钮的功能。 - 目标是从 $A$ 楼到 $B$ 楼,求最少按键次数,若无法到达则输出 `-1`。 - 输入包括 $N$(楼层数)、$A$(起点)和 $B$(终点),以及每层的 $K_i$ 数字。 - 使用广度优先搜索(BFS)解决,通过队列存储访问过的楼层,避免重复并计算步数。 - 当到达目标楼层时返回步数,队列空时返回 `-1`。
42 0
|
5月前
【洛谷 P1002】[NOIP2002 普及组] 过河卒 题解(递归+记忆化搜索)
`NOIP2002`普及组的过河卒问题是一个棋盘路径计数挑战。卒从$(0,0)$出发到$(n,m)$,只能向下或向右移动,马在$(c1,c2)$固定,控制某些点。任务是计算不受马阻挡的路径数。输入是目标和马的位置,输出是路径总数。使用动态规划和记忆化搜索避免重复计算,样例输入$(6,6,3,3)$输出$6$。代码中定义了$f(x,y)$计算$(x,y)$处的路径数,利用边界条件和递推关系计算。
68 0
|
6月前
【错题集-编程题】孩子们的游戏(圆圈中最后剩下的数)(约瑟夫环)
【错题集-编程题】孩子们的游戏(圆圈中最后剩下的数)(约瑟夫环)
|
6月前
每日一题——圆圈中最后剩下的数字(约瑟夫环问题)
每日一题——圆圈中最后剩下的数字(约瑟夫环问题)
洛谷P1135 奇怪的电梯——广搜
洛谷P1135 奇怪的电梯——广搜
103 0
洛谷P1443 马的遍历——广搜
洛谷P1443 马的遍历——广搜
76 0
|
存储
Leetcode-每日一题1210. 穿过迷宫的最少移动次数(BFS)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_46618592/article/details/128890280?spm=1001.2014.3001.5501
115 0
Leetcode-每日一题1210. 穿过迷宫的最少移动次数(BFS)
LeetCode每日一题——1823.找出游戏的获胜者(约瑟夫环问题)
共有 n 名小伙伴一起做游戏。小伙伴们围成一圈,按 顺时针顺序 从 1 到 n 编号。确切地说,从第 i 名小伙伴顺时针移动一位会到达第 (i+1) 名小伙伴的位置,其中 1 <= i < n ,从第 n 名小伙伴顺时针移动一位会回到第 1 名小伙伴的位置。
157 0
LeetCode每日一题——1823.找出游戏的获胜者(约瑟夫环问题)
HDU-致命武器(线段树)
HDU-致命武器(线段树)
89 0
|
机器学习/深度学习 C++
洛谷P1996 约瑟夫问题 c++链表做法
n 个人围成一圈,从第一个人开始报数,数到 mm 的人出列,再由下一个人重新从 11 开始报数,数到 mm 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。 输入格式 输入两个整数 n,mn,m。 输出格式 输出一行 nn 个整数,按顺序输出每个出圈人的编号。 输入输出样例 输入 #1 10 3 输出 #1 3 6 9 2 7 1 8 5 10 4
178 0