计蒜客——乳草的侵占(BFS)

BFS一直写不会,可能是多加了个队列,写起来不是太容易。不过最近还是稍微入门了BFS,跟DFS差别不太大,还是由三个部分组成——出口、标记、枚举。
DFS的主要的思想就是一条路走到黑。例如:有N个阶段,第N个阶段走不通,就返回第N-1个阶段尝试其他的可能。
而BFS维护的是一种层次关系,按照状态的层次扩展,每次离根节点越近的越先扩展。
所以,当要求最短路时,可以考虑用BFS(当然DFS在数据范围比较小的时候也OK),要求所有符合条件的情况时,考虑用DFS
下面看这道题(题目很恶心,我发现了第一个坑,但是还有第二个…)

这道题第一个坑:读入数据是行是倒着读入,列是正着读入…
我一开始写的是直接return step;得到的答案是8,明显不对。问了大佬才知道BFS并不像DFS那样:DFS每次执行都是保存着自己的答案,但是BFS在每次扩展都会有新的答案,我的写法最后返回的step,是在上一个状态基础上返回的,并不是最后一个状态的step。BFS求最短路,就是返回队列为空时最后状态的那个答案!然后我又加了个结构体成员,并且用ans记录每个状态的答案,这样的话每个状态下的ans都会更新,当队列为空时,ans保留的就是最后一次扩展的答案了。

过了样例,但是提交时候WA了,找了好久,原因是它搜索的起点也是倒着读进来的(崩溃!)…

直接放代码了:

#include <bits/stdc++.h>using namespace std;char mp[105][105];
bool vis[105][105];
int x,y,mx,my;
int ans;
int dir[8][2]={-1,0,-1,-1,0,-1,1,-1,1,0,1,1,0,1,-1,1};
struct node
{int x;int y;int d;node(int xx,int yy,int dd){x=xx;y=yy;d=dd;}
};
bool in(int n,int m)
{return n>=1&&n<=x&&m>=1&&m<=y;
}queue<node> q;
void bfs(int ux,int uy,int step)
{q.push(node(ux,uy,0));vis[ux][uy]=true;while(!q.empty()){node a=q.front();ans=a.d;//记录每个状态的步数 当BFS结束后就是最后一个状态的步数q.pop();for(int i=0;i<8;i++){int tx=a.x+dir[i][0];int ty=a.y+dir[i][1];if(in(tx,ty)&&!vis[tx][ty]&&mp[tx][ty]=='.'){vis[tx][ty]=true;q.push(node(tx,ty,a.d+1));}}}//return step; //不能在最后直接返回step 因为bfs每一次扩展都会得到一个新的状态 这里返回的step是在前一个状态的基础上加过来的return ;
}int main()
{scanf("%d%d%d%d",&y,&x,&mx,&my);for(int i=x;i>=1;i--){for(int j=1;j<=y;j++){cin>>mp[i][j];if(mp[i][j]=='*'){vis[i][j]=true;}}}//bfs(mx,my,0);bfs(my,mx,0);printf("%d\n",ans);return 0;
}

继续肝…离比赛最后一周,总结总结

坑!计蒜客——乳草的侵占相关推荐

  1. 计蒜客————乳草的侵占

    Farmer  John一直努力让他的草地充满鲜美多汁的而又健康的牧草.可惜天不从人愿,他在植物大战人类中败下阵来.邪恶的乳草已经在他的农场的西北部份佔领了一片立足之地. 草地像往常一样,被分割成一个 ...

  2. H - Prince and Princess 计蒜客 - 42402

    H - Prince and Princess 计蒜客 - 42402 题意: 你现在要寻找公主,有三种人,第一种是说真话的人(至少为1,因为公主是说真话的人),第二种人是只会说假话的,第三种是胡说八 ...

  3. 计蒜客 2020 蓝桥杯大学 A 组省赛模拟赛 (一)题目及解析

    新手,欢迎交流,剩下D题不知如何下手,望大佬指教. 计蒜客 2020 蓝桥杯大学 B 组省赛模拟赛 (一)题目及解析 文章目录 A. 结果填空:计算周长 B. 结果填空:七巧板 C. 结果填空:苹果 ...

  4. 计蒜客题解——T1157:派

    题目相关 题目链接 计蒜客,https://nanti.jisuanke.com/t/T1157. 我的OJ,http://47.110.135.197/problem.php?id=4951. 题目 ...

  5. 【原创】tyvj1038 忠诚 计蒜客 管家的忠诚 线段树(单点更新,区间查询)...

    [原创]tyvj1038 忠诚 & 计蒜客 管家的忠诚 & 线段树(单点更新,区间查询) 最简单的线段树之一,中文题目,不翻译.... 注释讲的比较少,这已经是最简单的线段树,如果看不 ...

  6. 计蒜客 2020 蓝桥杯大学 B 组省赛模拟赛 (一)题目及解析

    新手,欢迎交流,更新完毕. 计蒜客 2020 蓝桥杯大学 A 组省赛模拟赛 (一)题目及解析 文章目录 A. 结果填空:有趣的数字 B. 结果填空:爬楼梯 C. 结果填空:七巧板 D. 结果填空:苹果 ...

  7. 2020蓝桥杯B 组省赛计蒜客模拟赛(一)题解

    2020蓝桥杯省赛 B 组计蒜客模拟赛(一)目录 试题 A:有趣的数字(结果填空) 试题 B:爬楼梯(结果填空) 试题 C:七巧板(结果填空) 试题 D:苹果(结果填空) 试题 E:方阵(结果填空) ...

  8. 计蒜客2020蓝桥杯大学A组模拟赛题解

    计蒜客2020蓝桥杯大学A组模拟赛题解 蓝桥杯的话,去年拿了C++组的国二.今年报名了新成立的Python组,不知道能不能摸到国一的鱼 模拟赛链接如下: https://www.jisuanke.co ...

  9. 计蒜客 挑战难题 爬楼梯

    计蒜客 挑战难题 爬楼梯 假设你现在正在爬楼梯,楼梯有n级.每次你只能爬1级或者2级,那么你有多少种方法爬到楼梯的顶部? 格式: 第一行输入一个数n(n<=50),代表楼梯的级数. 接下来一行输 ...

最新文章

  1. Springboot+Docker+RabbitMQ教程来了。
  2. 在tnsnames.ora中配置监听
  3. android listView的setOnScrollListener的使用
  4. 玩转GIT系列之【git pull和git fetch的区别】
  5. Linux软件管理之yum
  6. rgb颜色查询工具_Web前端页面重构之工具篇(Photoshop)
  7. 电商:购物车模块解决思路
  8. Modelsim添加中间变量
  9. 输入一个正整数数组,输入一个正整数数组,把数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
  10. java中pmt计算_5个财务函数FV、PV、PMT、NPER与
  11. tplink控制上网设备_Tplink上网控制怎么设置限制小孩上网教程
  12. Android 图片资源大瘦身
  13. 模仿360安全卫士项目笔记3
  14. n1通过u盘跑linux,【总结】在N1上面成功刷入armbian并启动的步骤
  15. Pygame:动画精灵
  16. C语言:使用函数计算一个数的阶乘
  17. 【Dest0g3 520迎新赛】密码学部分Wp及LCG(线性同余生成器)攻击方法
  18. 已解决:小程序本地可以上传,正式发布就不行了(wx.uploadFile接口)
  19. Flash 实验 遮罩层
  20. Karma与TSLint

热门文章

  1. 基于单片机开发的快速体温计方案
  2. 习题 10.4 有两个矩阵a和b,均为2行3列。求两个矩阵之和。重载运算符“+”,使之能用于矩阵相加。如:c=a+b。
  3. Part 14  PhilClaire
  4. 【分享】如何用Pytho抓取微信公众号文章(包括阅读数,点赞数)
  5. Win10 + WSL2 + Ubuntu18.04 + CUDA 成功
  6. DN过账时,提示错误M7093-对于移动类型XXX和账户XXX不同的字段
  7. android同步目录,如何使用FolderSync在安卓手机上同步文件夹到坚果云?
  8. It Started With A Kiss
  9. 甲骨文的转型路,道阻且长
  10. JAVA实现微软语音实时翻译