首页 > 其他分享 >BFS 马的遍历————洛谷p1443

BFS 马的遍历————洛谷p1443

时间:2024-09-22 11:13:57浏览次数:11  
标签:洛谷 p1443 int step BFS leq flag que include

马的遍历

题目描述

有一个 \(n \times m\) 的棋盘,在某个点 \((x, y)\) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。

输入格式

输入只有一行四个整数,分别为 \(n, m, x, y\)。

输出格式

一个 \(n \times m\) 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 \(-1\))。

样例 #1

样例输入 #1

3 3 1 1

样例输出 #1

0    3    2    
3    -1   1    
2    1    4

提示

数据规模与约定

对于全部的测试点,保证 \(1 \leq x \leq n \leq 400\),\(1 \leq y \leq m \leq 400\)。

问题分析

常规的bfs题,每次入队八个方向,并标记入队时的层数,该层数即为马跳过的步数,越早跳到,所花费的步数就越少

#include<iostream>
#include <iomanip>
#include<cstring>
#include<queue>
using namespace std;
int n, m, x, y;
bool flag[450][450];//判断是否走过
int step[450][450] ; //记录步数
int dir[8][8] = { {1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1} }; //八个方向
queue<pair<int, int> >que; //这两个连续的>>最好还是加个空格,有的系统里会报错
void bfs(int x, int y) {
	step[x][y] = 0;
	flag[x][y] = true;
	que.push(make_pair(x, y));
	while (!que.empty()) {
		pair<int, int>t = que.front();
		que.pop();
		//flag[t.first][t.second] = true; //一开始把标记写在这里,没注意马可能会往回跳,所以应该在入队时就标记
		for (int i = 0; i < 8; i++) {
			int nx = t.first + dir[i][0], ny = t.second + dir[i][1];
			if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && !flag[nx][ny]) {
				que.push(make_pair(nx, ny));
				flag[nx][ny] = true; //标记
				step[nx][ny] = step[t.first][t.second] + 1; //记录步数
			}
		}
	}
}

int main() {
	cin >> n >> m >> x >> y;
	memset(flag, false, sizeof(flag));
	memset(step, -1, sizeof(step)); //初始化为-1
	bfs(x, y);
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cout << left << setw(5) << step[i][j]; //注意输出格式
		}
		cout << endl;
	}
	return 0;
}

标签:洛谷,p1443,int,step,BFS,leq,flag,que,include
From: https://www.cnblogs.com/oQAQo/p/18424193

相关文章

  • 洛谷 P1093 [NOIP2007 普及组] 奖学金
    [NOIP2007普及组]奖学金题目背景NOIP2007普及组T1题目描述某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前555名学生发奖学金。期末,每个学生都......
  • BFS 颜色填涂———洛谷p1162
    填涂颜色题目描述由数字\(0\)组成的方阵中,有一任意形状的由数字\(1\)构成的闭合圈。现要求把闭合圈内的所有空间都填写成\(2\)。例如:\(6\times6\)的方阵(\(n=6\)),涂色前和涂色后的方阵如下:如果从某个\(0\)出发,只向上下左右\(4\)个方向移动且仅经过其他\(0\)的情况下......
  • dfs 油滴拓展——洛谷p1378
    油滴扩展题目描述在一个长方形框子里,最多有\(N\)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界。必须等一个油滴扩展完毕才能放置下一个油滴。那么应该按照怎样的顺序在这\(N\)个点上放置油滴,才能使放置完毕后所有......
  • 【洛谷】P3128 [USACO15DEC] Max Flow P 的题解
    【洛谷】P3128[USACO15DEC]MaxFlowP的题解题目传送门题解谔谔,LCA+++树上差分,差点就被难倒了qaq今天就是CSP初赛了,祝大家也祝我自己rp++!!!其实是一道树上差......
  • 题解:洛谷P9934 [NFLSPC #6] 绝不能忘记的事……
    题目链接:洛谷P9934[NFLSPC#6]绝不能忘记的事……我hatelove大力分讨。这道题先分三种大情况:N在左边,N在中间,N在右边。声明:以下分类讨论中,a,b,c,d均为记住的字符串。记录操作N在左边当复制串形如Nab,可以用map<string,int>记录。当复制串形如NaH,那么......
  • 快速幂模板/洛谷P1226【模板】快速幂
    ​本题是CSP-J组的第四题。题意:给出一个有向图,当前在1号点,初始在时间0,必须在k的倍数的时间出发,且到终点的时间也必须是k的倍数。每条边有一个边权,只有在当前时间≥时才可以通过,且不能在原地不动,即每一个时间点必须走一条边。问从11号点出发到nn号时最早的时刻。(没......
  • 【洛谷 P5730】【深基5.例10】显示屏 题解(数组+循环)
    【深基5.例10】显示屏题目描述液晶屏上,每个阿拉伯数字都是可以显示成的点阵的(其中X表示亮点,.表示暗点)。现在给出数字位数(不超过)和一串数字,要求输出这些数字在显示屏上的效果。数字的显示方式如同样例输出,注意每个数字之间都有一列间隔。输入格式第一行输入一个正整数,表示数......
  • 洛谷题单指南-分治与倍增-P2345 [USACO04OPEN] MooFest G
    原题链接:https://www.luogu.com.cn/problem/P2345题意解读:有n头牛,每头牛都有听力v、坐标x两个属性,要计算每两头牛的max{vi​,vj​}×∣xi​−xj​∣之和。解题思路:首先想到的肯定是枚举法,需要O(n^2)的复杂度有没有优化的方法?可以采用分治法!由于是计算两头牛之间的max{vi​,......
  • 【洛谷】P11062 【MX-X4-T2】「Jason-1」加法 的题解
    【洛谷】P11062【MX-X4-T2】「Jason-1」加法的题解题目传送门离CSP初赛只剩两天了,祝各位OIersrp++!!!题解挺有意思的一道思维题,不过比赛的时候没想出来。需要分类讨论两种情况:当a......
  • 洛谷P8774 [蓝桥杯 2022 省 A] 爬树的甲壳虫 题解 期望DP
    题目链接:https://www.luogu.com.cn/problem/P8774思路:设\(f_i\)为甲壳虫从高度\(i\)到达高度\(n\)因为从高度\(i\)走\(1\)步有\(1-P_{i+1}\)的概率到达高度\(i+1\),有\(P_{i+1}\)的概率到达高度\(0\),所以:\(f_i=1+(1-P_{i+1})\timesf_{i+1}+P_{i+1}\times......