题目: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. Git撤销add、commit

    撤销add git status 查看当下更新的文件 git reset HEAD 表示撤销上次add的所有文件 git reset HEAD dir/dir/test.php 撤销指定文件 撤销co ...

  2. Workerman简单开发示例实践(一)

    一.去官网下载workerman,地址:https://www.workerman.net/download,下载后解压任意文件夹. 二.在解压文件目录下新建http_test.php,输入如下代码: ...

  3. Java 参数个数可变的函数

    示例: package my_package; public class Test { public static void main(String[] args) { out("重庆师范大 ...

  4. 【OGG】 RAC环境下管理OGG的高可用 (五)

    [OGG] RAC环境下管理OGG的高可用 (五) 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道 ...

  5. python爬取数据分析

    一.python爬虫使用的模块 1.import requests 2.from bs4 import BeautifulSoup 3.pandas 数据分析高级接口模块 二. 爬取数据在第一个请求中 ...

  6. Linux操作系统之grub加密实战案例

    Linux操作系统之grub加密实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为grub设置明文密码案例 1>.修改"/boot/grub/grub. ...

  7. Python+Selenium+Appium对APP进行UI自动化测试

    1. 安装Python3.7版本 pythonjava的JDK java -version javac nodejs node --versionappium 若nodejs安装完毕,使用npm安装a ...

  8. jquery对象转成dom对象

     jQuery库本质上还是JavaScript代码,它只是对JavaScript语言进行包装处理,为的是提供更好更方便快捷的DOM处理与开发中经常使用的功能.我们使用jQuery的同时也能混合Java ...

  9. 动态管理upsteam---nginx_http_dyups_module

    nginx_http_dyups_module  nginx_http_dyups_module是第三方开源软件,它提供API动态修改upstream的配置,并且支持Nginx的ip_hash.kee ...

  10. JAVA的概念理解:JavaSE、JavaEE、JavaME、jdk、jre、ide

    JavaSE是Java Standard Edtion的缩写,译成中文就是Java标准版,也是Java的核心.无论是 JavaEE(Java企业版)还是JavaME(Java微型版)都是以JavaSE ...