洛谷P1443-马的遍历(BFS)

简介: 洛谷P1443-马的遍历(BFS)

题目描述:


有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步


输入格式:


一行四个数据,棋盘的大小和马的坐标


输出格式:



一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)



样例输入:


3 3 1 1  


样例输出:


0 3 2

3 -1 1

2 1 4  


AC Code:


#include<bits/stdc++.h>
using namespace std;
const int N=401;//棋盘大小 
struct node {//定义结构体 
  int x,y;//分别存储队列在该位置的横纵坐标 
}que[N*N];
int vis[N][N];//该数组存储到达每个点的步数 
int dx[]={-1,-2,-2,-1,1,2,2,1};//马为中心,可以扩展出8个点 
int dy[]={2,1,-1,-2,-2,-1,1,2};//即8个方向 
int main() {
  int n,m,sx,sy,head,tail;
  scanf("%d %d %d %d",&n,&m,&sx,&sy);
  for(int i=1;i<=n;i++) {
    for(int j=1;j<=m;j++) {
      vis[i][j]=-1;//全部初始化为-1 
    }
  }
  vis[sx][sy]=0;//起始点,显然需要0步 
  head=tail=1;//队头队尾初始化 
  que[head].x=sx;//起始点入队 
  que[head].y=sy;
  tail++;//起始点入队,队尾向后移动一格 
  while(head<tail) {
    int s=vis[que[head].x][que[head].y]+1;//扩展到下一个点的步数,对应第33行的代码语句 
    for(int i=0;i<8;i++) {//8个方向搜索 
      int tx=que[head].x+dx[i];
      int ty=que[head].y+dy[i];
      if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&vis[tx][ty]==-1) {
      //没有走出棋盘且这个点没有走过 
        que[tail].x=tx;//新的点入队 
        que[tail].y=ty;
        tail++;//同时队尾向后移动一格 
        vis[tx][ty]=s;//由上一个点扩展到该点,步数加1,对应第24行的代码语句 
      }
    }
    head++;//队头向后移动一格,搜索下一个点 
  }
  for(int i=1;i<=n;i++) {
    for(int j=1;j<=m;j++) {
      printf("%-5d",vis[i][j]);//注意格式,左对齐,占5列 
    }
    printf("\n");
  }
  return 0;
}
相关文章
|
5月前
【洛谷 P1443】马的遍历 题解(广度优先搜索)
该问题是一个棋盘上的马的最短路径问题。给定一个$n\times m$的棋盘和起点$(x, y)$,需要计算马到达棋盘上每个位置的最短步数。输入包含$n, m, x, y$,输出是一个矩阵,表示各位置的步数或未可达的$-1$。使用广度优先搜索(BFS)策略,从起点开始遍历,直到访问完所有可达位置。代码中定义了太阳数组表示马的移动方向,并通过队列实现BFS。最后输出格式要求每个数字左对齐且域宽为5。
35 0
|
5月前
|
存储 算法 数据可视化
LeetCode 题目 97:动态规划、递归到广度优先搜索BFS 实现交错字符串
LeetCode 题目 97:动态规划、递归到广度优先搜索BFS 实现交错字符串
|
6月前
|
算法
深度优先搜索(DFS、深搜)和广度优先搜索(BFS、广搜)(上)
深度优先搜索(DFS、深搜)和广度优先搜索(BFS、广搜)
93 0
|
6月前
深度优先搜索(DFS、深搜)和广度优先搜索(BFS、广搜)(下)
深度优先搜索(DFS、深搜)和广度优先搜索(BFS、广搜)
36 0
|
6月前
|
存储 人工智能
深度优先搜索(DFS、深搜)和广度优先搜索(BFS、广搜)(中)
深度优先搜索(DFS、深搜)和广度优先搜索(BFS、广搜)
47 0
|
11月前
|
算法
每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历
每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历
|
程序员 定位技术 C++
[蓝桥杯] 双指针、BFS和DFS与图论问题
本篇文章针对蓝桥杯比赛的考点,列出双指针、BFS和DFS与图论的相关习题以及知识点的解释。希望本篇文章会对你有所帮助。
86 0
|
Java
BFS广度优先遍历——Acwing 844. 走迷宫
BFS广度优先遍历——Acwing 844. 走迷宫
82 0
洛谷P1443 马的遍历——广搜
洛谷P1443 马的遍历——广搜
76 0
洛谷(2947)向右看齐-单调栈-链表
单调栈对新手来说不好理解,但链表就特别简单,但在有时间限制的竞赛中,很容易超时,因此如果实在要使用链表,注意使用链表的类型,Java提供的两种实现链表的方式