题目:https://www.luogu.org/problemnew/show/P1443

简单的BFS模板题——因为我写出来了。

分析过程:

n*m矩阵,用二维数组

数据不大,二维数组稳了

先把二维数组初始化为-1,马的坐标,即起点的坐标再设为0

接着开始遍历——8个方向(下过中国象棋的大牛应该不陌生)

设一个结构,储存落点的位置与所走的步数,每走一次就记录一次

此时,还要判断落点是否还是-1,这样就可以避免重复

本来这样就可以AC了,但此题有个陷阱就是:

输出格式:

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

所以,要在输出上花点心思......(其实是要注意审题)

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define MAXN 402
using namespace std; int ans[MAXN][MAXN];
int n, m, n_b, m_b;
int run_x[] = { , , , , -, -, -, - };
int run_y[] = { , -, , -, , -, , - }; struct node{
int x, y;
int step;
}; queue<node> q; void bfs(){
node a;
a.x = n_b;
a.y = m_b;
a.step = ;
ans[a.x][a.y] = a.step;
q.push(a); while(!q.empty()){
node b = q.front();
node c;
q.pop();
for(int i = ; i < ; i++){
c.x = b.x + run_x[i];
c.y = b.y + run_y[i];
if( < c.x && c.x <= n && < c.y && c.y <= m
&& ans[c.x][c.y] == -){
c.step = b.step + ;
ans[c.x][c.y] = c.step;
q.push(c);
}
}
}
} int main()
{
while(cin >> n >> m >> n_b >> m_b){
memset(ans, -, sizeof(ans));
bfs();
for(int i = ; i <= n; i++){
for(int j = ; j <= m; j++){
printf("%-5d", ans[i][j]);
}
cout << endl;
}
}
return ;
}

下面说说我对BFS的理解

BFS与DFS有个很相似的地方:对于所有情况,它们都做着相同的行为来遍历完所有情况。

所以,BFS里肯定有一个“核心循环”(这里指对于每个方法路径的遍历),然后再判断下一位置是否还满足条件。

如:

for(int i = ; i < ; i++){
c.x = b.x + run_x[i];
c.y = b.y + run_y[i];
if( < c.x && c.x <= n && < c.y && c.y <= m
      && ans[c.x][c.y] == -){
c.step = b.step + ;
ans[c.x][c.y] = c.step;
q.push(c);
}
}

这里的循环是对马的8个方向的遍历,接着if语句是判断马跳下一步后是否还在棋盘上或者是否已经来过。

虽然我做过的题不多,但做过的题都有这种“核心循环”,所以就特意画出来做了个笔记。

嘻嘻,说了这么多好像还云里雾里的感觉。

不知是不是,感觉学习算法还是要抓住那类算法的特性去理解,这样学起来就会更轻松。

有点理解师兄所说的:只要思维理解了,代码的实现就不是问题了。

【洛谷】P1443 马的遍历的更多相关文章

  1. 【bfs】洛谷 P1443 马的遍历

    题目:P1443 马的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 记录一下第一道ac的bfs,原理是利用队列queue记录下一层的所有点,然后一层一层遍历: 其中: 1.p ...

  2. 洛谷 P1443 马的遍历

    P1443 马的遍历 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘 ...

  3. 洛谷P1443 马的遍历

    https://www.luogu.org/problemnew/show/P1443 很经典的搜索题了,蒟蒻用广搜打的 不说了,上代码! #include<bits/stdc++.h> ...

  4. 洛谷 P1443 马的遍历

    终于遇到一个简单纯粹一点的bfs了...... 题目链接:https://www.luogu.org/problemnew/show/P1443 题目是求到达一个点的最短步数 也就是说我只要bfs遍历 ...

  5. 洛谷 P1443 马的遍历题解

    题目链接:https://www.luogu.org/problem/P1443 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个 ...

  6. 【洛谷P1443 马的遍历】

    题目链接(%%%jyy大佬) 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数 ...

  7. 洛谷P1443马的遍历

    传送 这是个广搜,思路和普通的迷宫题差不多,但我卡了3遍,为什么呢? 因为输出格式 题目要求左对齐,宽度为5输出,在此说一下如何控制宽度. 下面的m都为要求的宽度 int 类型: printf: %m ...

  8. 洛谷P1443 马的遍历(bfs,注意输出格式)

    题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出 ...

  9. 洛谷P1443 马的遍历【BFS】

    题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出 ...

  10. 洛谷——P1443 马的遍历

    https://www.luogu.org/problem/show?pid=1443#sub 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达 ...

随机推荐

  1. HTTP协议的认识

    1.内容回顾 1.HTTP协议消息的格式: 1.请求(request) 请求方法 路径 HTTP/1.1 \r\n k1:v1\r\n ...\r\n \r\n 请求体 <--这里可以有可以没有 ...

  2. Java自学-数组 Arrays

    java.util.Arrays类常用方法 Arrays是针对数组的工具类,可以进行 排序,查找,复制填充等功能. 大大提高了开发人员的工作效率. 步骤 1 : 数组复制 与使用System.arra ...

  3. vue页面跳转拦截器

    登录拦截逻辑 第一步:路由拦截 首先在定义路由的时候就需要多添加一个自定义字段requireAuth,用于判断该路由的访问是否需要登录.如果用户已经登录,则顺利进入路由, 否则就进入登录页面.在路由管 ...

  4. Html-CSS-细节处理

    1.input 添加padding后宽度会变化 input中添加如下样式,固定 box 的尺寸 box-sizing: border-box; -webkit-box-sizing: border-b ...

  5. iOS OpenCV资料收集

    OpenCV iOS Title: OpenCV iOS Hello Compatibility: > OpenCV 2.4.3 Author: Charu Hans You will lear ...

  6. POSIX 使用互斥量和条件变量实现生产者/消费者问题

    boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t 和pthread_cond_t的一系列的封装.因此通过 ...

  7. Linux之RHEL7root密码破解(三)

    Linux系列root密码破解第三种方式,利用修改boot分区里的开机启动顺序来修改密码,即我们进入BIOS,修改boot启动顺序为CD-ROM: 接下来按F10保存退出 选择Troubleshoot ...

  8. kubernetes存储之GlusterFS

    目录 1.glusterfs概述 1.1.glusterfs简介 1.2.glusterfs特点 1.3.glusterfs卷的模式 2.heketi概述 3.部署heketi+glusterfs 3 ...

  9. Linux-网络RAID技术DRBD

    DRBD简介 官方文档 DRBD的全称为:Distributed Replicated Block Device(DRBD)分布式块设备复制,DRBD是由内核模块和相关脚本构成,用以构建高可用的集群. ...

  10. YES, There is No such thing as a free lunch

    软件行业本身就建立在copy的基础上的,据说视窗both Windows and Mac OS都借鉴了施乐的. 国内的很多的软件质量真的好差呀. https://queue.acm.org/detai ...