马的遍历 洛谷 p1443
题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入输出格式
输入格式:
一行四个数据,棋盘的大小和马的坐标
输出格式:
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入输出样例
3 3 1 1
0 3 2
3 -1 1
2 1 4
一道比较明显的广度优先搜索题,可以发现,起始点值为0,当马第一次跳到哪个点时就是哪个点应该标记的值,并且后续跳到同一个点后会重复循环,一定不是最优解,所以只需保留每个点的第一次遍历到的状态即可,如果发现当前遍历到的点已经被遍历过了,就跳过此点,继续扩展,知道没有可以扩展的点,即所有可能的点都已被遍历过,而遍历不到的点只需在开始时将矩阵初始化为-1就可以保证正确了。
但是题中还有一个条件,就是输出“左对齐,宽5格”,两个条件都可以用printf搞定,只需在“%”与“d”间加上“-5”即可,“-”代表左对齐,“5”代表输出宽5格,还有一个小技巧就是可以再“5”前加“0”,这样可以补足5位前导0,但是注意与“-”左对齐共同使用并无卵用
上代码:
#include<cstdio>
#include<iostream>
using namespace std;
int n,m,sy,sx,head,tail,ty,tx;
int map[][];
struct que{
int y,x,step;
}q[];
int main(){
scanf("%d%d%d%d",&n,&m,&sy,&sx);
for(int i=;i<=n;i++){//先初始化为-1
for(int j=;j<=m;j++){
map[i][j]=-;
}
}
head=tail=;
map[sy][sx]=;
q[tail].y=sy;
q[tail].x=sx;
q[tail++].step=;
while(head<tail){
ty=q[head].y;
tx=q[head].x;
if(map[ty-][tx+]==-){//向马能跳到的八个方向遍历
//-1判断是否仍未遍历过,保证是第一次遍历
q[tail].y=ty-;
q[tail].x=tx+;
q[tail].step=q[head].step+;
map[ty-][tx+]=q[tail].step;
tail++;
}
if(map[ty-][tx+]==-){
q[tail].y=ty-;
q[tail].x=tx+;
q[tail].step=q[head].step+;
map[ty-][tx+]=q[tail].step;
tail++;
}
if(map[ty+][tx+]==-){
q[tail].y=ty+;
q[tail].x=tx+;
q[tail].step=q[head].step+;
map[ty+][tx+]=q[tail].step;
tail++;
}
if(map[ty+][tx+]==-){
q[tail].y=ty+;
q[tail].x=tx+;
q[tail].step=q[head].step+;
map[ty+][tx+]=q[tail].step;
tail++;
}
if(map[ty+][tx-]==-){
q[tail].y=ty+;
q[tail].x=tx-;
q[tail].step=q[head].step+;
map[ty+][tx-]=q[tail].step;
tail++;
}
if(map[ty+][tx-]==-){
q[tail].y=ty+;
q[tail].x=tx-;
q[tail].step=q[head].step+;
map[ty+][tx-]=q[tail].step;
tail++;
}
if(map[ty-][tx-]==-){
q[tail].y=ty-;
q[tail].x=tx-;
q[tail].step=q[head].step+;
map[ty-][tx-]=q[tail].step;
tail++;
}
if(map[ty-][tx-]==-){
q[tail].y=ty-;
q[tail].x=tx-;
q[tail].step=q[head].step+;
map[ty-][tx-]=q[tail].step;
tail++;
}
head++;
}
for(int i=;i<=n;i++,puts("")){
for(int j=;j<=m;j++){
printf("%-5d",map[i][j]);//左对齐 宽5格
}
}
return ;
}
马的遍历 洛谷 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),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出 ...
随机推荐
- MySQL快速入门 基本技能篇
写在之前的话: 之前一直在用MSSERVER,刚用MySQL时有很多的不适应.就此小结一下工作中遇到的问题和场景,文中出现的局限性欢迎指出 MySQL有客户端式(SQLyog),可托拉拽和写代码:或者 ...
- javaWeb第一天
//第一个JavaWeb项目package com.chy.action; import java.io.IOException; import javax.servlet.ServletExcept ...
- AJAX学习笔记(一)基础知识
一.HTTP协议 1.HTTP: 计算机通过网络进行通讯的规则,用于浏览器向服务器发送请求. 2.HTTP是一种无状态的协议,无状态是指服务器端不保留任何连接相关的信息,浏览器客户端向服务器发送请求, ...
- ES语法注意事项
在函数内部定义全局变量:举个栗子 function fn(){ var str = "hezhi"; } -alert(str) //=>fn不执行的 =>str is ...
- Linux - iostat命令详解
简介 iostat可以提供更丰富的IO性能状态数据,iostat命令有两个用途: 输出CPU的统计信息 输出设备和分区的I/O统计信息 命令语法及参数说明 语法: iostat [ -c | -d ] ...
- php 时间问题
获得简单的日期 date() 函数的格式参数是必需的,它们规定如何格式化日期或时间. 下面列出了一些常用于日期的字符: d - 表示月里的某天(01-31) m - 表示月(01-12) Y - 表示 ...
- 虚拟硬盘格式vdi、vhd、vmdk相互转换
Windows7的引导程序能够引导vhd格式的虚拟硬盘,而VirtualBox创建的虚拟硬盘文件是vdi格式的,怎么办呢? 以前要借助其他软件才能实现,但是VirtualBox早就悄悄为我们带来了一个 ...
- Oracle 10gR2分析函数
Oracle 10gR2分析函数汇总 (Translated By caizhuoyi 2008‐9‐19) 说明: 1. 原文中底色为黄的部分翻译存在商榷之处,请大家踊跃提意见: 2. 原文中淡 ...
- redhat系列linux系统 修改主机名的正确方法
##注:无特别说明,以下称呼的linux系统统一视为redhat系linux redhat系列linux系统 如果想修改主机名 很多人可能都会以为是: $hostname NEW-NAME 或者在 / ...
- SVN常见问题
one or more files are in a conflicted state.(一个或多个文件处于矛盾状态)意思是这个文件已经被其他人修改过了. 然后我点击ok按钮后,找到冲突的文件再次up ...