姊妹篇(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刷题总结相关推荐

  1. 图解算法数据结构刷题笔记02

    系列文章目录 图解算法数据结构刷题笔记01 本篇文章目录 系列文章目录 前言 1.剑指 Offer 05. 替换空格 2.剑指 Offer 06. 从尾到头打印链表 3.剑指 Offer 09. 用两 ...

  2. 【C/C++】蓝桥杯算法必刷题(三)目标ICPC铜/蓝桥杯国一

    目录 前言 题解文章汇总 题目传送门:算法必刷题(三) 该题单中第一类考点:二进制 1018.有趣的二进制 1019.[NOIP2006]数列 1020.只能吃土豆的牛牛 该题单中第二类考点:思维 1 ...

  3. 【C/C++】蓝桥杯算法必刷题(一)目标ICPC铜/蓝桥杯国一

    目录 前言 该题单中第一类考点:输入输出 1001.这是一道签到题 1005.乘法表 1006.KiKi学程序设计基础 1007.疫情死亡率 该题单中第二类考点:思维题 1002.排列式 1018.开 ...

  4. 面试算法LeetCode刷题班—BAT面试官带你刷真题、过笔试

    课程名称: <面试算法LeetCode刷题班> --BAT面试官带你刷真题.过笔试 主讲老师: 林老师 BAT资深研发工程师(T7/P8级),致力于搜索引擎及其子系统的研发.迭代与优化,数 ...

  5. 算法入门刷题笔记 Day10 - A - 拓扑排序·一 -- D - K-th Path

    写在前面 好久没更新公众号和博客了,因为最近在研究新的方向,所以很少发文. 笔者接触编程只有一年,这一年间主要研究启发式算法在运筹学中的应用.但是由于编程基础薄弱,在进一步研究复杂运筹学问题时发现基础 ...

  6. php算法在线刷题,c,算法_每日一道算法:leetcode 刷题碰到的问题。,c,算法 - phpStudy...

    每日一道算法:leetcode 刷题碰到的问题. 这是题目: Given an unsorted array nums, reorder it such that nums[0] < nums[ ...

  7. 子集和问题 算法_LeetCode刷题实战90:子集 II

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  8. python基础刷题_数据结构与算法LeetCode刷题(Python)

    参考资料: 一.链表 1.  链表的必备知识要点(包括基础知识.刷题中使用的STL等知识) 2.  链表逆序(LeetCode 92 ,206. Reverse Linked List 1,2) 3. ...

  9. 【算法】刷题范围建议 和 代码规范

    文章目录 一.刷题范围建议 二.代码规范 一.刷题范围建议 面试算法 侧重实践 , 工程 ; 并不是所有的算法都适合面试 , 靠背诵解决问题的算法 , 只能解决单个问题没有推广性的算法 , 有简称 , ...

  10. 算法入门刷题笔记 Day2 K - Coat of Anticubism L - Five-In-a-Row M - Island Puzzl......

    写在前面 好久没更新公众号和博客了,因为最近在研究新的方向,所以很少发文. 笔者接触编程只有一年,这一年间主要研究启发式算法在运筹学中的应用.但是由于编程基础薄弱,在进一步研究复杂运筹学问题时发现基础 ...

最新文章

  1. 121. Best Time to Buy and Sell Stock
  2. 制造型企业如何降低成本提升核心竞争力
  3. 32位x86处理器架构
  4. C++ 的变量书写规则探讨
  5. 关于中层管理者的会议态度
  6. 机器找不到 libcudnn.so.6
  7. 被骂十几年,躺赚上千亿!这个“土匪”行业,还能浪多久?
  8. 大话数据结构 -07-1 图的定义、抽象数据类型与存储结构
  9. dataGridView1.DataSource多增加列,数据不进自己规定的列?
  10. 在手语世界里,健听人、数字人与听障人的交织
  11. AC日记——独木桥 洛谷 p1007
  12. 聚类算法 optics
  13. oracle连接no listener
  14. python自动剪视频_python剪切视频与合并视频的实现
  15. 【资讯】2017年乌镇互联网大会,互联网大佬们齐聚首
  16. 保护你的 Flutter 应用程序
  17. 画风突变!用友云全新定义数字企业智能服务
  18. 程序员如何保持身心健康?
  19. Android5.0以上去除状态栏半透明遮罩
  20. 矩形波如何傅立叶展开_动态演示:圆柱的展开——动态数学软件GeoGebra制作教程...

热门文章

  1. 深度学习 VS 传统计算机视觉
  2. 应用深度学习进行乳腺癌检测
  3. 使用变量对象引出作用域链
  4. python基础-变量运算符(3)
  5. 混合云环境中扩展Kubernetes的挑战及方案
  6. vue-cli3 第三版安装搭建项目
  7. 自制ACL+DHCP实验(初版)
  8. Flash 在 EK 被利用漏洞 Top 10 中占 8 个位置
  9. java中@Qualifier(string)是什么用法
  10. SHELL-命令解释程序