首页 > 其他分享 >洛谷P1443 马的遍历(bfs模版题)

洛谷P1443 马的遍历(bfs模版题)

时间:2024-03-27 15:22:06浏览次数:35  
标签:洛谷 P1443 int bfs cy cx maxn discovery

洛谷P1443

马的遍历

https://www.luogu.com.cn/problem/P1443

一道经典的bfs入门题

这里贴上代码

//#define LOCAL 1
#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
//#define int long long
#define endl "\n";
using namespace std;
const int maxn = 500;
int G[maxn][maxn], m, n, x, y;
bool discovery[maxn][maxn];
const int dx[8] = { -1,-2,-2,-1,1,2,2,1 };
const int dy[8] = { 2,1,-1,-2,2,1,-1,-2 };
struct node {
    int x, y;
};
void bfs(int x, int y) {
    queue<node> F;
    F.push({ x,y });
    G[x][y] = 0;
    discovery[x][y] = true;
    while (!F.empty()) {
        int u = F.front().x;
        int v = F.front().y;
        F.pop();
        for (int i = 0; i < 8; i++) {
            int cx = u + dx[i];
            int cy = v + dy[i];
            if (cx <= 0 || cy <= 0 || cx > n || cy > m || discovery[cx][cy]) continue;
            F.push({ cx,cy });
            G[cx][cy] = G[u][v] + 1;
            discovery[cx][cy] = true;
        }
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
#ifdef LOCAL
    freopen("stdin", "r", stdin);
    freopen("stdout", "w", stdout);
#endif
    cin >> n >> m >> x >> y;
    memset(G, -1, sizeof(G));
    memset(discovery, false, sizeof(discovery));
    bfs(x, y);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            printf("%-5d", G[i][j]);
        }
        printf("\n");
    }
    return 0;
}
这里用PII也可以,本人偏好结构体

(在洛谷看更好)

这是一道经典的bfs模版题

但是有一些需要注意的点

这里不说题目本身,因为不是很难

这里说一下我发现的问题

数组下标从1开始还是从0开始一定要统一,因为大部分人一开始学习的都是下标从0开始

所以一开始用1作为第一个下标的时候可能会混,这一点要注意

下一个就是不要混用printf和cout

这里引用一篇博客

https://blog.csdn.net/ltx06/article/details/14434519

这篇博客中讲了加速流为什么会导致混用printf和cout时会出现输出顺序不一样的结果

标签:洛谷,P1443,int,bfs,cy,cx,maxn,discovery
From: https://www.cnblogs.com/1DeomS2/p/18099392

相关文章

  • 洛谷题单指南-图的基本应用-P3916 图的遍历
    原题链接:https://www.luogu.com.cn/problem/P3916题意解读:寻找每个点所能到达的最大的点。解题思路:直观上,可以依次从每个点开始DFS搜索,记录经过的最大点,复杂度是O(n^2)级别,会超时。可以换一种角度,既然要找每个点可以达到的最大值,那么可以反向建图,从最大值出发,所经过的点能达到......
  • 洛谷 P8306 【模板】字典树
    写模板:1确定树的节点指针数量2确定起始字符3实现插入方法4根据题目编写求解方法,或者添加计数元素到节点中structNode{array<int,100>next{};intcnt=0;};classTrie{public:Trie(charstart):start_(start),root_(0){trie_.resize(1)......
  • 洛谷 P5937 [CEOI1999] Parity Game
    题意:区间长度为n,m个查询。每次查询给出区间与一个数值0或者1,代表区间内的1的个数。找出不矛盾的最后一个询问。思路:首先用到区间压缩,排序后去重即可。使用带权dsu,如果是同一个root,那么xor运算看是否符合输入。如果不是同一个root,直接合并。这里合并区间的时候权重更新有点抽象,xx......
  • 洛谷题单指南-图的基本应用-P5318 【深基18.例3】查找文献
    原题链接:https://www.luogu.com.cn/problem/P5318题意解读:图的建立、DFS、BFS模版题。解题思路:本题主要考察建图、图的DFS、BFS遍历。建图方式:领接表vector<int>g[N];需要注意的是,在DFS、BFS搜索领接点时,需要先将领接点编号排序,满足题目要求的“如果有很多篇文章可以参阅,请......
  • 洛谷题单指南-集合-P2814 家谱
    原题链接:https://www.luogu.com.cn/problem/P2814题意解读:已知多组父子关系,找某个人最早的祖先,并查集的应用。解题思路:由于存在真正的父子关系,所以在并查集合并的时候,要把p[x]=y中x设置为子,y设置为父,其余都是并查集的常规操作。由于是计算姓名之间的父子关系,并查集可以用map......
  • 洛谷 P9237 [蓝桥杯 2023 省 A] 像素放置
    题意:n*m的方格,有的格子是数字,是数字的格子代表了相邻(包括自己)的9个格子内颜色值为1的格子有这么多个。给出这个方格,求满足条件的颜色方格,保证答案唯一。n<=10,m<=10。思路:想不出好办法,直接暴力+剪枝。暴力好说,01dfs即可,关键是如何剪枝。剪枝肯定是已经不会再变动颜色的......
  • 洛谷题单指南-集合-P3879 [TJOI2010] 阅读理解
    原题链接:https://www.luogu.com.cn/problem/P3879题意解读:此题本质上是计算倒排索引,所谓倒排索引,即不是通过文章来找单词,而是通过单词来找文章。解题思路:要建立单词和文章之间的关系,一个单词对应多篇文章,且要按照文章编号排序,可以使用如下数据结构:map<string,set<int>>h;只......
  • 十三 1355. 母亲的牛奶 (BFS)
    1355.母亲的牛奶(BFS)思路:使用BFS搜索所有可能出现的情况,同时保存到used数组,防止重复搜索,最后遍历used数组,因为只求C桶中牛奶,所有先遍历C桶,出现A桶为空立即打印结果并break。importjava.util.*;publicclassMain{privatestaticintA,B,C;privatestatic......
  • 洛谷题单指南-集合-P1955 [NOI2015] 程序自动分析
    原题链接:https://www.luogu.com.cn/problem/P1955题意解读:要判断约数条件是否可以同时满足,主要是要判断不相等的情况。解题思路:对于相等的条件,直接进行集合合并即可;对于不相等的条件,判断两者是否属于同一个集合,如果形成矛盾,则条件不能成立。由于i,j的范围至10^9,定义并查集如果......
  • 洛谷 P3374 【模板】树状数组 1
    classFenwickTree{public:FenwickTree(intsz):sz_(sz){ft_.resize(sz_);}FenwickTree(vector<longlong>&f){sz_=int(f.size());ft_.assign(sz_,0);for(inti=1;i<sz_;++i){ft......