【算法】BFS刷题总结
姊妹篇(DFS)
目录
- 一.入门级
- P1747 好奇怪的游戏
- TRDD got lost again
- 二.进阶
- final的BFS Abbott's Revenge
一.入门级
P1747 好奇怪的游戏
P1747 好奇怪的游戏
题目描述
爱与愁大神坐在公交车上无聊,于是玩起了手机。一款奇怪的游戏进入了爱与愁大神的眼帘:***(游戏名被打上了马赛克)。这个游戏类似象棋,但是只有黑白马各一匹,在点x1,y1和x2,y2上。它们得从点x1,y1和x2,y2走到1,1。这个游戏与普通象棋不同的地方是:马可以走“日”,也可以像象走“田”。现在爱与愁大神想知道两匹马到1,1的最少步数,你能帮他解决这个问题么?
思路: 基础的入门题
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stdio.h>
#include<cmath>
#include<deque>
#include<queue>
#define debug cout<<"ok"<<endl
typedef long long ll;
const int maxn=1e3+1;
const int mod=1e9+7;
using namespace std;
struct node
{int x,y,step;node(int a=0,int b=0,int c=0)//结构体函数{x=a,y=b,step=c;}
};
int dx[12]={1,1,2,2,2,2,-1,-1,-2,-2,-2,-2};//走法
int dy[12]={-2,2,-2,-1,1,2,-2,2,-1,1,-2,2};
int x1,x2,y_1,y2;
bool vis[maxn][maxn];//标记是否走过
queue<node>q;//队列实现bfs
void bfs(int a,int b)
{q.push(node(a,b,0));//放vis[a][b]=true;//标while(!q.empty()){node nn=q.front();//取q.pop();//扔for(int i=0;i<12;i++){int nx=nn.x+dx[i];//走int ny=nn.y+dy[i];if(nx>0&&ny>0&&!vis[nx][ny]&&nx<100&&ny<100)//判{q.push(node(nx,ny,nn.step+1));//放vis[nx][ny]=true;//标}if(nx==1&&ny==1)//判{cout<<nn.step+1<<endl;return;}}}
}
int main()
{cin>>x1>>y_1>>x2>>y2;bfs(x1,y_1);memset(vis,false,sizeof(vis));while(!q.empty())q.pop();//清空bfs(x2,y2);return 0;
}
另一种思路: dfs+记忆化搜素
#include<bits/stdc++.h>
using namespace std;
int x,y,f[30][30];
//f[i][j]:从i,j走到1,1所需的最小步数
int dx[13]={0,-2,-2,+2,+2,-1,-1,+1,+1,-2,-2,+2,+2};
int dy[13]={0,-1,+1,-1,+1,-2,+2,-2,+2,-2,+2,-2,+2};
//马字8个方向,田字4个方向
void dfs(int x,int y,int step) //记忆化搜索,走到x,y花了step步
{f[x][y]=step; //更新最小步数 for (int i=1;i<=12;i++) //12个方向走一遍 {int xx=x+dx[i];int yy=y+dy[i];if (xx>=1&&xx<=20&&yy>=1&&yy<=20&&(f[xx][yy]==0||f[xx][yy]>step+1)) dfs(xx,yy,step+1);//如果没超出边界并且xx,yy可以被更新,就继续走 }
}
int main()
{for (int i=1;i<=2;i++){scanf("%d%d",&x,&y);memset(f,0,sizeof(f));dfs(x,y,0); //走到x,y需要0步 printf("%d\n",f[1][1]); //最后输出 }return 0;
}
赞,dfs天下第一,能用dfs就不用bfs
链接:https://ac.nowcoder.com/acm/contest/322/B
来源:牛客网
TRDD got lost again
TRDD got lost again
题目描述
X城市是一个交通十分不便利的城市,城市可以看成一个n * m大小的矩阵, 现在TRDD手里有该城市的地图:一个2*n+1行, 2 *m+1列大小的地图。现在TRDD所在的格子用S表示,机场所在的格子用T表示。 其他格子用空格表示,地图上左右相邻的两个格子如果不能通行用"|“表示, 上下相邻的两个点如果不能通行用”-“表示,”+“表示格子的四个角。 题目保证城市X最外圈无法通行(具体请看样例输入)。 为了能尽快赶到机场,TRDD想请你帮忙计算出他到达机场最少需要走过多少个格子(包括起点S和终点T)。 如果无法到达机场T,则输出"TRDD Got lost…TAT”(不包括双引号)。
输入描述:
第一行读入两个数n, m(1 <= n, m <= 3000)表示X城市的大小。之后有2 * n + 1行, 每行有2 * m + 1个字符, 用来表示TRDD手里的地图题目保证S和T都有且仅有一个。
输出描述:
如果TRDD能到达机场, 则输出TRDD最少需要经过几个格子否则输出"TRDD Got lost…TAT"(不包括双引号)
输入:
4 3
+-+-+-+
|S| | |
+ +-+-+
| | | |
+ +-+-+
| |T |
+ +-+ +
| |
+-+-+-+
输出:8
由于数据量过大,建议不要使用scanf("%c")读入,否则可能会TLE。
思路:此题细节颇多,注意c++11可以用gets()
,而c++14却不能用(gets
有安全隐患故删除)
#include<bits/stdc++.h>
#define debug cout<<"ok"<<endl
typedef long long ll;
const int maxn=6005;
const int mod=1e9+7;
using namespace std;
int n,m,nx,ny,steps,ans,tx,ty,sx,sy;
inline int read()
{int x=0,f=0;char ch=getchar();while(ch>'9'||ch<'0'){f|=(ch=='-');ch=getchar();}while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return f?-x:x;
}
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
bool vis[maxn][maxn];
char mp[maxn][maxn];
struct node
{int x,y,step;node(int a=0,int b=0,int c=0){x=a,y=b,step=c;}
};
queue<node>q;
void bfs(int x,int y)
{vis[x][y]=true;q.push(node(x,y,1));while(!q.empty()){nx=q.front().x;ny=q.front().y;javascript:void(0);steps=q.front().step;q.pop();for(int i=0;i<4;i++){int xx=nx+dx[i];int yy=ny+dy[i];if(xx>0&&yy>0&&xx<=n&&yy<=m&&!vis[xx][yy]&&(mp[xx][yy]=='T'||mp[xx][yy]==' ')){q.push(node(xx,yy,steps+1));javascript:void(0); vis[xx][yy]=true;}if(mp[xx][yy]=='T'){cout<<(steps+2)/2<<endl;return ;}}}printf("TRDD Got lost...TAT\n");
}
int main()
{memset(vis,false,sizeof(vis));//n=read(),m=read();//快读就不需要加getchr()快读万岁!!;cin>>n>>m;getchar();//注意必须要有这个getcgar()!!;m=2*m+1;n=2*n+1;int flag=0;for(int i=1;i<=n;i++){gets(mp[i]);if(!flag)for(int j=1;j<=m;j++)if(mp[i][j]=='S'){sx=i,sy=j;flag=1;}}bfs(sx,sy);return 0;
}
二.进阶
final的BFS Abbott’s Revenge
这是一个链接
注:如果您通过本文,有(qi)用(guai)的知识增加了,请您点个赞再离开,如果不嫌弃的话,点个关注再走吧 ! 当然,也非常欢迎您能在讨论区指出此文的不足处,作者会及时对文章加以修正 !如果有任何问题,欢迎评论,非常乐意为您解答!( •̀ ω •́ )✧
【算法】BFS刷题总结相关推荐
- 图解算法数据结构刷题笔记02
系列文章目录 图解算法数据结构刷题笔记01 本篇文章目录 系列文章目录 前言 1.剑指 Offer 05. 替换空格 2.剑指 Offer 06. 从尾到头打印链表 3.剑指 Offer 09. 用两 ...
- 【C/C++】蓝桥杯算法必刷题(三)目标ICPC铜/蓝桥杯国一
目录 前言 题解文章汇总 题目传送门:算法必刷题(三) 该题单中第一类考点:二进制 1018.有趣的二进制 1019.[NOIP2006]数列 1020.只能吃土豆的牛牛 该题单中第二类考点:思维 1 ...
- 【C/C++】蓝桥杯算法必刷题(一)目标ICPC铜/蓝桥杯国一
目录 前言 该题单中第一类考点:输入输出 1001.这是一道签到题 1005.乘法表 1006.KiKi学程序设计基础 1007.疫情死亡率 该题单中第二类考点:思维题 1002.排列式 1018.开 ...
- 面试算法LeetCode刷题班—BAT面试官带你刷真题、过笔试
课程名称: <面试算法LeetCode刷题班> --BAT面试官带你刷真题.过笔试 主讲老师: 林老师 BAT资深研发工程师(T7/P8级),致力于搜索引擎及其子系统的研发.迭代与优化,数 ...
- 算法入门刷题笔记 Day10 - A - 拓扑排序·一 -- D - K-th Path
写在前面 好久没更新公众号和博客了,因为最近在研究新的方向,所以很少发文. 笔者接触编程只有一年,这一年间主要研究启发式算法在运筹学中的应用.但是由于编程基础薄弱,在进一步研究复杂运筹学问题时发现基础 ...
- php算法在线刷题,c,算法_每日一道算法:leetcode 刷题碰到的问题。,c,算法 - phpStudy...
每日一道算法:leetcode 刷题碰到的问题. 这是题目: Given an unsorted array nums, reorder it such that nums[0] < nums[ ...
- 子集和问题 算法_LeetCode刷题实战90:子集 II
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...
- python基础刷题_数据结构与算法LeetCode刷题(Python)
参考资料: 一.链表 1. 链表的必备知识要点(包括基础知识.刷题中使用的STL等知识) 2. 链表逆序(LeetCode 92 ,206. Reverse Linked List 1,2) 3. ...
- 【算法】刷题范围建议 和 代码规范
文章目录 一.刷题范围建议 二.代码规范 一.刷题范围建议 面试算法 侧重实践 , 工程 ; 并不是所有的算法都适合面试 , 靠背诵解决问题的算法 , 只能解决单个问题没有推广性的算法 , 有简称 , ...
- 算法入门刷题笔记 Day2 K - Coat of Anticubism L - Five-In-a-Row M - Island Puzzl......
写在前面 好久没更新公众号和博客了,因为最近在研究新的方向,所以很少发文. 笔者接触编程只有一年,这一年间主要研究启发式算法在运筹学中的应用.但是由于编程基础薄弱,在进一步研究复杂运筹学问题时发现基础 ...
最新文章
- 121. Best Time to Buy and Sell Stock
- 制造型企业如何降低成本提升核心竞争力
- 32位x86处理器架构
- C++ 的变量书写规则探讨
- 关于中层管理者的会议态度
- 机器找不到 libcudnn.so.6
- 被骂十几年,躺赚上千亿!这个“土匪”行业,还能浪多久?
- 大话数据结构 -07-1 图的定义、抽象数据类型与存储结构
- dataGridView1.DataSource多增加列,数据不进自己规定的列?
- 在手语世界里,健听人、数字人与听障人的交织
- AC日记——独木桥 洛谷 p1007
- 聚类算法 optics
- oracle连接no listener
- python自动剪视频_python剪切视频与合并视频的实现
- 【资讯】2017年乌镇互联网大会,互联网大佬们齐聚首
- 保护你的 Flutter 应用程序
- 画风突变!用友云全新定义数字企业智能服务
- 程序员如何保持身心健康?
- Android5.0以上去除状态栏半透明遮罩
- 矩形波如何傅立叶展开_动态演示:圆柱的展开——动态数学软件GeoGebra制作教程...