首页 > 其他分享 >蓝桥杯:七步诗 ← bfs

蓝桥杯:七步诗 ← bfs

时间:2024-04-05 22:59:44浏览次数:14  
标签:豆子 bfs ch int 七步 st 蓝桥 豆萁 马儿

【题目来源】
https://www.lanqiao.cn/problems/3447/learning/

【题目描述】
煮豆燃豆苴,豆在釜中泣。本是同根生,相煎何太急?---曹植

所以,这道题目关乎豆子!
话说赤壁之战结束后,曹操的船舰被刘备烧了,引领军队从华容道撤退,路上遇到了泥泞,道路不通畅,又刮起了大风,没办法,只好让羸弱的士兵背着草填在马下,骑兵才能过去。
走着走着,军队路遇—片豆地,由于战马已经饥饿难耐,急需吃些豆子补充体力,这样才能继续行进,但是大家都知道,马儿只会走“日”字,于是问题来了,已知豆地的大小为 n×m(n 行 m 列),每个坐标点上面有散落着的豆子、枯萎的豆萁以及坑洼的湿地,马儿只会吃豆子,不会吃豆萁,且马儿不会走到坑洼的湿地上面,因为湿地会让它深陷其中,无法行动;当然也不能走到 n ×m 豆地范围之外。
为了方便描述,豆子用字母 b 表示,豆萁用字母 q 表示,湿地用字母 x 表示,马儿所在的位置用字母S表示(题目测试数据保证 S 在 n×m 的豆地范围内),现在请你计算—下,马儿最多能吃到豆地里面多少颗豆子,并输出对应的答案。

【输入格式】
输入第 1 行包含两个正整数 n 和 m,表示豆地的大小。
第 2~n+1 行每行包含 m 个字符,表示豆地里面的豆子、豆萁、湿地以及马儿所在的起点位置。

【输出格式】
输出—行,这—行包含一个整数,表示答案。

【样例输入1】
2 3
Sqx
xxx

【输出样例1】
0

【输入样例2】
3 3
bbb
Sqb
bbb

【输出样例2】
7

【说明/提示】
对于所有评测数据,1≤n, m≤400。

【算法分析】
BFS算法助记:建-入-量:头-出-入,详见:
https://blog.csdn.net/hnjzsyjyj/article/details/125801217

【算法代码】

#include<bits/stdc++.h>
using namespace std;

typedef pair<int,int> PII;

const int maxn=404;
int st[maxn][maxn];
int n,m;
int sx,sy;
int dx[]= {-2,-1,1,2,2,1,-1,-2};
int dy[]= {1,2,2,1,-1,-2,-2,-1};

queue<PII> Q;
int bfs(int x,int y) {
    int ans=0;
    Q.push({x,y});
    while(Q.size()) {
        PII t=Q.front();
        int x=t.first;
        int y=t.second;
        Q.pop();
        for(int i=0; i<8; i++) {
            int nx=x+dx[i];
            int ny=y+dy[i];
            if(nx>=0 && nx<n && ny>=0 && ny<m && (st[nx][ny]==0 || st[nx][ny]==-1)) {
                if(st[nx][ny]==0) ans++;
                st[nx][ny]=1;
                Q.push({nx,ny});
            }
        }
    }
    return ans;
}

int main() {
    cin>>n>>m;
    char ch;
    for(int i=0; i<n; i++) {
        for(int j=0; j<m; j++) {
            cin>>ch;
            if(ch=='b') st[i][j]=0;
            else if(ch=='q') st[i][j]=-1;
            else if(ch=='S') sx=i,sy=j;
            else st[i][j]=1;
        }
    }
    st[sx][sy]=1;

    cout<<bfs(sx,sy);

    return 0;
}


/*
in1:
2 3
Sqx
xxx

out1:
0
---------
in2:
3 3
bbb
Sqb
bbb

out2:
7
*/




【参考文献】
https://www.lanqiao.cn/problems/3447/learning






 

标签:豆子,bfs,ch,int,七步,st,蓝桥,豆萁,马儿
From: https://blog.csdn.net/hnjzsyjyj/article/details/137378164

相关文章

  • 代码随想录 | 图论 797. 所有可能的路径(dfs) ,200. 岛屿数量 (dfs)200. 岛屿数量 (bfs)
    797.所有可能的路径https://leetcode.cn/problems/all-paths-from-source-to-target/description/List<List<Integer>>res;List<Integer>path;publicList<List<Integer>>allPathsSourceTarget(int[][]graph){res=newA......
  • 蓝桥杯 试题 基础练习 Fibonacci数列
    问题描述Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。输入格式输入包含一个整数n。输出格式输出一行,包含一个整数,表示Fn除以10007的余数。说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要......
  • 蓝桥杯备考随手记: Scanner 类中常用方法
    Scanner类是Java中用于从标准输入、文件或其他输入流中读取数据的类。它提供了一系列方法来读取不同类型的数据,例如整数、浮点数、字符串等。在Java中,Scanner类位于java.util包中,使用时需要先导入该包。使用Scanner类需要先创建一个Scanner对象,并将要读取的输入流传递给它的......
  • 蓝桥杯_省_21B_E_路径(c++)
    题目描述小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图中的最短路径。小蓝的图由2021个结点组成,依次编号1至2021。对于两个不同的结点a,b,如果a和b的差的绝对值大于21,则两个结点之间没有边相连;如果a和b的差的绝对值小于等于21,则两个点之间......
  • 全球变暖蓝桥杯2018省赛真题
    全球变暖蓝桥杯2018省赛真题DFS大法全球变暖#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongboolflag;chara[1010][1010];intcnt,n,ans=0,pre_ans=0,d[4][2]={1,0,-1,0,0,1,0,-1};voiddfs(intx,inty){if(x>=n||x<0||y>=n||y<0||a......
  • 图的遍历-BFS
    1.BFS遍历BFS算法的思想:对一个无向连通图,在访问图中某一起始顶点v后,由v出发,依次访问v的所有未访问过的邻接顶点w1,w2,w3,…wt;然后再顺序访问w1,w2,w3,…wt的所有还未访问过的邻接顶点;再从这些访问过的顶点出发,再访问它们的所有还未访问过的邻接顶点,……,如此直......
  • 蓝桥杯备考随手记: 常用的三种排序算法(冒泡排序、插入排序、选择排序)
    1.冒泡排序(BubbleSort)冒泡排序是一种简单直观的排序算法,在待排序序列中不断地交换相邻两个元素的位置,通过多次遍历,将最大(或最小)的元素逐渐向右(或左)移动到正确的位置,直到整个序列有序。冒泡排序的基本思想如下:从序列的第一个元素开始,比较相邻两个元素的大小。如果前一个元......
  • 第15届蓝桥STEMA测评真题剖析-2024年3月10日Scratch编程初中级组
    [导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第180讲。第15届蓝桥第5次STEMA测评,这是2024年3月10日举办的STEMA,比赛仍然采取线上形式。这是Scratch初/中级组真题,试题包括两种题型,分别是选择题和编程创作......
  • 蓝桥杯,省赛,dfs专题,地宫取宝,小朋友崇拜圈,飞机降落
    #include<bits/stdc++.h>usingnamespacestd;intn,m,k;inta[55][55];//输入所给数组值所分配的内存空间intdp[55][55][15][15];//开创记忆化的存储空间//因为只进行向下走和向右走,所有写成这个样子,不明白的可以在了解以下笛卡尔积,向下是x轴,向右是y轴(一般情况下)int......
  • P8687 [蓝桥杯 2019 省 A] 糖果
    原题链接题解二进制表示每包糖果包含的味道,因为有一种拼接的感觉,然后背包dp,注意这里每个材料不止只能取一个code#include<bits/stdc++.h>usingnamespacestd;intdp[1<<22]={0},candy[105]={0};constintinf=2e9;intmain(){intn,m,k;cin>>n>>m>>k;......