集训作业 洛谷P1443 马的遍历
这个题是个搜索,而且有是最少的步数,肯定就是广搜啦,不知道为什么的同学先去学习一下广搜吧。
养成好习惯,看见最少步数就去想想广搜(只是我自己觉得)
竟然这个题可以如此顺畅的想到广搜,感觉不难啊,但还有一个奇怪的地方,
emm,这个有点冷门啊,没事,讲讲(百度一下)就知道了。
奉上百度答案:printf("%-5d",x);
这句话的意思就是左对齐,宽5格,输出x。
到这里我们几乎就全讲完了(我讲的好水,听不的懂的同学去隔壁dgdger的博客看看吧,传送门)
广搜嘛,我直接附上之前讲广搜的链接吧,广搜。
对了,还有一个马的走法,我直接上图吧

红色的实心圆是马的位置,剩下的黑实心圆是可以走到的位置,上面的红字是坐标(应该是对的)
emm,接下来的讲解就打成注释吧,要仔细看代码哦。
#include<iostream>
#include<cstdio>
using namespace std;
struct z
{
int x,y,bushu=0;
}ma[200000];//400*400=160000
int a1[10]={1,-1,1,-1,-2,-2,2,2};//这是控制马移动方向的数组,a1是x,a2是y
int a2[10]={-2,-2,2,2,-1,1,-1,1};//众所周知,马走日,所以就这样写了。
int a[500][500],book[500][500],n,m,qx,qy,zx,zy,t,w;//a是记录到达每个点最小位置的数组,book就是记忆化数组。
int main()
{
cin>>n>>m>>qx>>qy;//正常的输入
a[qx][qy]=-1;//来一波初始化,为什么要初始化成-1呢?因为这样不被走到的地方就直接是-1了,不用另外判断。
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
a[i][j]=-1;
}
}
a[qx][qy]=0;//出生点不需要走就可以到达。
book[qx][qy]=1;//来过出生点,再来就是绕路了。
t=0;//头和尾
w=0;
ma[t].x=qx;//这里我用的数组,queue也可以的。
ma[t].y=qy;//存下位置
ma[t].bushu=0;//存下步数
t++;
while(w<t)//还是有地方可以走的(目前不绕路的地方)
{
for(int i=0;i<8;i++)//马有8个走法
{
zx=ma[w].x+a1[i];//zx和zy表示这一次走完后的位置。
zy=ma[w].y+a2[i];
if(zx<=n&&zx>0&&zy<=m&&zy>0&&book[zx][zy]==0)//如果没有绕圈子,也没有越界,才可以储存
{
//绕圈子就是广搜中的记忆化搜索,大家可以学一下
book[zx][zy]=1;//现在我来过这个地方了。下次来就可以知道是绕圈子了。
ma[t].x=zx;//存下来
ma[t].y=zy;
ma[t].bushu=ma[w].bushu+1;//我从上一个地方走来,用ma[w].bushu步,走到这里用了一步,加起来就是从起点走到这里用的步数啦。
a[zx][zy]=ma[t].bushu;//这个位置是第一次来,那就一定是最小步数。
t++;
}
}
w++;//别忘了w++,重复查看一个点是会TLE的。
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
printf("%-5d",a[i][j]);//左对齐,宽5格
}
cout<<endl;
}
return 0;//完美结束
}
这个题和别的广搜没啥区别,如果你这个题过不了,希望你去学习或巩固一下广搜。
结束了……
集训作业 洛谷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),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出 ...
随机推荐
- PHP丨PHP基础知识之条件语IF判断「理论篇」
if语句是指编程语言(包括c语言.C#.VB.java.php.汇编语言等)中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一. if语句概述 if语句是指编程语言(包 ...
- GitHub 热点速览 Vol.25:距离优雅编程你差个它
作者:HelloGitHub-小鱼干 摘要:如何优雅地夸一个程序员呢?vscode-rainbow-fart 作为一个彩虹屁的项目,深得程序员心,能在你编程时疯狂称赞你的除了你自己,还有它.除了鼓励之 ...
- 小师妹学JVM之:JIT中的PrintCompilation
目录 简介 PrintCompilation 分析PrintCompilation的结果 总结 简介 上篇文章我们讲到了JIT中的LogCompilation,将编译的日志都收集起来,存到日志文件里面 ...
- 使用java类的方式配置spring 需要什么注解?
1.@Configuration 修饰类,声明当前类是一个配置类,相当于applicationContext.xml文件 2.@ComponentScan 用于指定spring在初始化容器时要扫描的包 ...
- vim 常用指令-持续更新
1. 查询文件夹file1内文件数量:ls file1 | wc -l 2. 生成文件夹file1内的文件列表:find file1 -type f > list.txt 3. git管理文件, ...
- Python实用笔记 (20)面向对象编程——继承和多态
当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Super class). ...
- postman不能启动的问题解决
1.postman启动不了,启动时提示“postman resolving transporter buffer”,不能正常启动 第一步,删除:在chrome-更多工具-扩展程序里面删除了postma ...
- 使用Spring Cache集成Redis
SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...
- Pytest 单元测试框架标记用例
1.Pytest 中标记用例 接参数 -k 来挑选要执行的测试项 pytest -k test_szdcs -s test_szdcs 为函数名称 -k 后面接的名称可以为函数名称.类名称.文件名称. ...
- 关于数据文件的文件头1-P2
文章目录 1 疑问点 2 问题模拟 2.1 dump 0,1块 2.2 查看trc文件 2.3 如何查看 1 疑问点 这里引用p2处的一段话: 事实上,每个文件的前128个块,都是文件头,被Oracl ...