洛谷P1443马的遍历
这是个广搜,思路和普通的迷宫题差不多,但我卡了3遍,为什么呢?
因为输出格式
题目要求左对齐,宽度为5输出,在此说一下如何控制宽度。
下面的m都为要求的宽度
int 类型:
printf: %md(现在是右对齐)
左对齐:%-md
cout:cout<<left<<setw(m)<<"你要输出的东西balabala"<<endl;(左对齐)
cout<<right<<setw(m)<<"你要输出的东西balabala"<<endl;(右对齐)
显然这里我们要写printf("%-5d",a[i][j]);
解决输出,剩下就是广搜模板的问题了。
首先先让马的起点坐标入队,然后在8个方向上扩展。
那到达每个点需要的步数就是到达这个点之前一个点的步数+1(类似递推吧),用a[i][j]记录到达点(i,j)的步数。
广搜到最后,如果有a[i][j]为0且(i,j)不是起点,就把它变为-1,然后输出。
代码如下:
#include<iostream>
#include<cstdio>
#include<queue>
#include<iomanip>
using namespace std;
int n,m,sx,sy,a[][],dx[]={,,,,-,-,-,-},dy[]={,-,,-,,-,,-};
bool vis[][];
struct dl{
int x,y;
dl(int xx,int yy):x(xx),y(yy){}//构造函数,入队用的
//意思就是把x赋值为xx,把y赋值为yy
};
queue<dl>q;
bool hf(int xx,int yy)
{if(vis[xx][yy])return ;
if(xx<||yy<||xx>n||yy>m)return ;
return ;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&sx,&sy);
a[sx][sy]=;
vis[sx][sy]=;
q.push(dl(sx,sy));
while(!q.empty())
{dl ex=q.front();
q.pop();
for(int i=;i<=;i++)
{int xx=ex.x,yy=ex.y;
xx+=dx[i];yy+=dy[i];
if(hf(xx,yy))
{//printf("xx=%d,yy=%d\n",xx,yy);
//getchar(); 分享一下个人广搜的测试方法qwq
a[xx][yy]=a[ex.x][ex.y]+;
vis[xx][yy]=;
q.push(dl(xx,yy));
}
}
}
for(int i=;i<=n;i++)
{for(int j=;j<=m;j++)
{if(a[i][j]==&&(i!=sx||j!=sy))
a[i][j]=-;
printf("%-5d",a[i][j]);
}
printf("\n");
}
}
洛谷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 马的遍历(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),在某个点上有一个马,要求你计算出马到达 ...
随机推荐
- 『OpenCV3』基于色彩分割图片
一.遍历图像实现色彩掩码 本节我们实现这样一个算法,我们指定某种颜色和一个阈值,根据输入图片生成一张掩码,标记符合的像素(和指定颜色的差异在阈值容忍内). 源代码如下,我们使用一个class完成这个目 ...
- servlet_filter简介
Filter总结: 1.Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静 ...
- java基础---->Serializable的使用
本次讲解中我们建立一个Java的项目去体会一下序列化Serializable的使用,序列化的原理以及序列化的自定义请参见我的另外一篇博客(java高级---->Serializable序列化的源 ...
- BootCamp 在MacBook 上安装Win10
首先到网上下载win10的ISO光盘, 制作win10安装盘时,一直停在copy文件.最后文件还是没有copy完整. 需要手工把iso里的文件拷贝到U盘里. 否则提示source\install.wi ...
- leetcode 翻转二叉树
翻转二叉树的步骤: 1.翻转根节点的左子树(递归调用当前函数) 2.翻转根节点的右子树(递归调用当前函数) 3.交换根节点的左子节点与右子节点 class Solution{ public: void ...
- wed
先有一个无后缀的flag 文件 第一次改成 TXT 收索FLAG 得到了一段 flag.txt f返回到第一次修改后缀 改成RAR 打开RAR 发现一个 flag.txt 的文件 打开,即得到 fla ...
- C#磁性窗体设计
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- huffman(greedy)
present a file by binary character code,let the less characters can be presented simplier. package g ...
- 基于Verilog的带FIFO写入缓冲的串口发送接口封装
一.模块框图及基本思路 tx_module:串口发送的核心模块,详细介绍请参照前面的“基于Verilog的串口发送实验” fifo2tx_module:当fifo不为空时,读取fifo中的数据并使能发 ...
- 提供一个Java字符串转整型数组的方法
package edu.yuliang.Data_Structure_Basics; import java.util.Scanner; public class new_string { publi ...