马的遍历 洛谷 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
测试电脑:本机ip是125.216.250.67 其他电脑 125.216.250.68 第一步:先用其他电脑ping本机,看能否ping通 如上图即为成功ping通了 第二步:开放mysql的全向 ...
- eclipse 导入git库 Android工程
1. 导入git库 1.1 从git库 clone 代码 在file->import中选中Git 目录下的Projects from Git 点击Next 选择 URL 点击Next 输入URL ...
- 浅析ConcurrentHashMap
一.导论 这些天一直在看关于多线程和高并发的书籍,也对jdk中的并发措施了解了些许,看到concurrentHashMap的时候感觉知识点很乱,有必要写篇博客整理记录一下. 当资源在多线程下共享时会产 ...
- (转载)KMP算法讲解
网上找到了一篇详细讲解KMP字符串匹配算法,质量很高.特备忘于此. 摘自:http://blog.csdn.net/v_july_v/article/details/7041827 实现代码如下: / ...
- python - bilibili(四)抓包数据乱码
上一篇文章中不知道大家发现端倪木有,两张照片对比很明显发现第一张是信息很明显的,第二张是乱码的. 为什么会出现这种情况?细心的童鞋可能发现是我们发送给服务器的请求连接的数据不同: 第一张图的信息是{& ...
- @RequestParam与@PathVariable的区别
在spring MVC中,两者的作用都是将request里的参数的值绑定到contorl里的方法参数里的,区别在于,URL写法不同. 使用@RequestParam时,URL是这样的:http://h ...
- DDD理论学习系列(10)-- 聚合
DDD理论学习系列--案例及目录 1.引言 聚合,最初是UML类图中的概念,表示一种强的关联关系,是一种整体与部分的关系,且部分能够离开整体而独立存在,如车和轮胎. 在DDD中,聚合也可以用来表示整体 ...
- Educational Codeforces Round 25 Five-In-a-Row(DFS)
题目网址:http://codeforces.com/contest/825/problem/B 题目: Alice and Bob play 5-in-a-row game. They have ...
- 如何使用OLAMI自然语言理解开放平台API制作自己的智能对话助手小程序
我们经常在电影中看到机器和人对答如流,随着越来越多自然语言开放平台的出现,IT爱好者制作一个自己的APP或者小玩具等逐渐可以变为现实. 自然语言对话即你的APP或者你制作的工具.机器人等能够对用户输入 ...
- HashTable的故事----Jdk源码解读
HashTable的故事 很早之前,在讲HashMap的时候,我们就说过hash是散列,把...弄碎的意思.hashtable中的hash也是这个意思,而table呢,是指数据表格,也就是说hasht ...