【洛谷】P1443 马的遍历
题目: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 马的遍历的更多相关文章
- 【bfs】洛谷 P1443 马的遍历
题目:P1443 马的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 记录一下第一道ac的bfs,原理是利用队列queue记录下一层的所有点,然后一层一层遍历: 其中: 1.p ...
- 洛谷 P1443 马的遍历
P1443 马的遍历 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘 ...
- 洛谷P1443 马的遍历
https://www.luogu.org/problemnew/show/P1443 很经典的搜索题了,蒟蒻用广搜打的 不说了,上代码! #include<bits/stdc++.h> ...
- 洛谷 P1443 马的遍历
终于遇到一个简单纯粹一点的bfs了...... 题目链接:https://www.luogu.org/problemnew/show/P1443 题目是求到达一个点的最短步数 也就是说我只要bfs遍历 ...
- 洛谷 P1443 马的遍历题解
题目链接:https://www.luogu.org/problem/P1443 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个 ...
- 【洛谷P1443 马的遍历】
题目链接(%%%jyy大佬) 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数 ...
- 洛谷P1443马的遍历
传送 这是个广搜,思路和普通的迷宫题差不多,但我卡了3遍,为什么呢? 因为输出格式 题目要求左对齐,宽度为5输出,在此说一下如何控制宽度. 下面的m都为要求的宽度 int 类型: printf: %m ...
- 洛谷P1443 马的遍历(bfs,注意输出格式)
题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出 ...
- 洛谷P1443 马的遍历【BFS】
题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出 ...
- 洛谷——P1443 马的遍历
https://www.luogu.org/problem/show?pid=1443#sub 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达 ...
随机推荐
- Matlab组合模式
组合模式(Composite),将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.组合模式的目的是让客户端不再区分操作的是组合对象(Compos ...
- mouseover和mouseenter两个事件的区别
mouseover(鼠标覆盖) mouseenter(鼠标进入) 二者的本质区别在于,mouseenter不会冒泡,简单的说,它不会被它本身的子元素的状态影响到.但是mouseover就会被它的子元素 ...
- 【RAC】 RAC For W2K8R2 安装--总体规划 (一)
[RAC] RAC For W2K8R2 安装--总体规划 (一) 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一 ...
- 六、Linux_SSH服务器状态
一.保持Xshell连接Linux服务器状态 1.登录服务器后 cd /etc/ssh/ vim sshd_config 找到 ClientAliveInterval 0和ClientAliveCou ...
- ThinkPHP支持的4种路由模式
下面这个说法和示例,比较具有总结性.
- Good Numbers(HDU5447+唯一分解)
题目链接 传送门 题面 题意 首先定义对于\(k\)的好数\(u\):如果\(u\leq k\)且\(u\)的所有质因子与\(k\)的质因子一样则称\(u\)对于\(k\)是一个好数. 现给你两个数\ ...
- poj3268 Silver Cow Party(最短路)
非常感谢kuangbin专题啊,这道题一开始模拟邻接表做的,反向边不好处理,邻接矩阵的话舒服多了. 题意:给n头牛和m条有向边,每头牛1~n编号,求所有牛中到x编号去的最短路+回来的最短路的最大值. ...
- python笔记36-装饰器之wraps
前言 前面一篇对python装饰器有了初步的了解了,但是还不够完美,领导看了后又提出了新的需求,希望运行的日志能显示出具体运行的哪个函数. __name__和doc __name__用于获取函数的名称 ...
- 账户(/etc/passwd、/etc/shadow)与组(/etc/group、/etc/gshadow)文件解析
1. 账户信息文件 账户信息被保存在 /etc/passwd 文件中,通过命令 cat /etc/passwd 查看文件内容如下: [root@192 ~]# cat /etc/passwdroot: ...
- CodeForces - 76A:Gift (最小生成树 解决单调性问题是思想)
题意:给定N点M边的无向连通图,每条边有两个权值(g,s). 给定G,S. 让你给出一组(g0,s0)使得图中仅留下g<=g0, s<=s0的边之后,依然连通,并求Gg0+Ss0的最小值. ...