一天,蒜头君梦见自己当上了王子,但是不幸的是,自己的公主被可恶的巫婆抓走了。于是蒜头君动用全国的力量得知,自己的公主被巫婆抓进一个迷宫里面。由于全国只有蒜头君自己可以翻越迷宫外的城墙,蒜头君便自己一人走上的拯救自己公主的路途。

碰巧的是巫婆出去了,迷宫也不大,蒜头君可以直接和公主对话,于是两个人便开始相互靠近。每一步移动只能朝着上下左右四个方向走一格,不能走进墙所在的位置。蒜头君救公主心切,一次必须沿着一个方向走两步(允许跨越迷宫中的墙);公主柔弱,一次只能走一步。问在这个迷宫中,蒜头君是否可以救出公主(蒜头君和公主相遇后,就能背着公主逃出迷宫了)。

输入格式

第一行输入两个整数 n(1≤n≤100), m(1≤m≤100) 表示迷宫的行和列。

然后有一个 n×m 的地图,地图由'.''#''w''g'这四个部分组成。'.'表示可以通行的路,'#'表示迷宫的墙,'w'表示王子开始所在的位置,'g'表示公主开始所在的位置。

输出格式

输出王子是不可以救出自己的公主,如果能救出则输出"yes",否则输出"no"

样例输入复制

1 8
w....#.g

样例输出复制

yes

思路:

这道题的关键是,需要两次搜索,分别表示王子和公主走过的路

然后看看是否他们可以走过同一个位置

如果可以,说明可以救出

代码:

#include<iostream>
using namespace std;
int n,m;
int ax,ay,bx,by;
char s[105][105];
int w[105][105],g[105][105]; //记录王子公主所经过的点
//int step_2[4][2] = {{2,0},{-2,0},{0,2},{0,-2}};
int step[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int vis[105][105][3];  //标记是否走过,第三维度表示是公主走的还是王子void dfs(int x, int y, int tar)
{if(s[x][y]  == '#')return ;if(tar == 2) //王子 w[x][y] = 1; //记录王子经过的点 if(tar == 1)g[x][y] = 1; //记录公主经过的点 for(int i=0;i<4;i++){int tx = x + tar * step[i][0];int ty = y + tar * step[i][1];if(tx<=0 || tx>n || ty<=0 || ty>m)continue;if(!vis[tx][ty][tar]){vis[tx][ty][tar] = true;dfs(tx, ty, tar);    }       }return ;
} int main()
{std::ios::sync_with_stdio(false);cin.tie(0);cin>>n>>m;for(int i=1; i<=n;i++){for(int j=1; j<=m;j++){cin>>s[i][j];if(s[i][j] == 'w'){ //记录王子的坐标 ax = i; ay = j;}if(s[i][j] == 'g'){bx = i; by = j;} }}dfs(ax, ay, 2); //由王子进行搜索,标记出所有王子到达的点 dfs(bx, by, 1);//由公主进行搜索,标记出所有公主到达的点for(int i=1; i<=n;i++){for(int j=1; j<=m;j++){//若王子公主能到达同一点,则可以救出 if(w[i][j] == g[i][j] && w[i][j] && g[i][j]){cout<<"yes"<<endl;return 0;}}}cout<<"no"<<endl;return 0;
}

DFS练习——王子救公主相关推荐

  1. 【DFS题型九/双向DFS】王子救公主

    题目描述: 一天,蒜头君梦见自己当上了王子,但是不幸的是,自己的公主被可恶的巫婆抓走了.于是蒜头君动用全国的力量得知,自己的公主被巫婆抓进一个迷宫里面.由于全国只有蒜头君自己可以翻越迷宫外的城墙,蒜头 ...

  2. java王子救公主的游_计蒜客 王子救公主(DFS)

    一天,蒜头君梦见自己当上了王子,但是不幸的是,自己的公主被可恶的巫婆抓走了.于是蒜头君动用全国的力量得知,自己的公主被巫婆抓进一个迷宫里面.由于全国只有蒜头君自己可以翻越迷宫外的城墙,蒜头君便自己一人 ...

  3. 计蒜客:王子救公主---dfs

    题目描述: 一天,蒜头君梦见自己当上了王子,但是不幸的是,自己的公主被可恶的巫婆抓走了.于是蒜头君动用全国的力量得知,自己的公主被巫婆抓进一个迷宫里面.由于全国只有蒜头君自己可以翻越迷宫外的城墙,蒜头 ...

  4. 计蒜客 王子救公主 dfs

    题意:如上,注意王子有可能跨越墙,前提使正好挨着墙. 思路:dfs王子和公主,开一个三维数组分别用vis[x][y][0],vis[x][y][1]标记王子和公主走到的点. 若存在二点相交即(vis[ ...

  5. 王子救公主(DFS)

    样例输入 1 8 w....#.g 样例输出 yes 解题思路: 两次搜索: 1.第一次对王子进行搜索,标记王子能到达的所有点. 2.第二次对公主进行搜索,如果公主能到达王子标记过的点,那么说明王子可 ...

  6. 王子救公主 (计蒜客)一道简单DFS

    蓝桥杯不能粘贴  只能截图.. 这道题目很简单,主要想清楚 只要存在王子和公主都能到达的点,王子就能救出公主(此时必定有一个时刻可以让他们相遇) #include <bits/stdc++.h& ...

  7. 【DFS专题训练】王子救公主 C++程序题

    题目描述 王子走两步,公主走一步,遇到#不能走,他们能否碰上 输入 1 8 w-#.g 输出 yes 思路 王子深搜一次记录走过的地方,公主深搜一次记录走过的地方,如果都走过就返回yes #inclu ...

  8. 【深度优先搜索】计蒜客:王子救公主

    思路:用两次深度优先搜索,数组vis1标记王子可能到达的点,数组vis2标记公主可能到达的点: 如果两个数组有重复的标记的坐标,那么王子可以救出公主 !标记所有可能情况的深度优先搜索不需要回溯! 如果 ...

  9. “趣味”or“烧脑”算法 之 王子救公主

    | 题引 相信大部分人童年都玩过大富豪这样一类的棋,棋格上面有加多少分,减多少分等等设置,比赛最终谁的分值最多(类似下面这个棋盘) | 正题 设置小游戏为一个二维矩阵, 王子位于左上角,公主位于右下角 ...

最新文章

  1. 最早接触到的计算机编程语言——c语言
  2. js练习 好友列表选择
  3. 复现经典:《统计学习方法》第18章 概率潜在语义分析
  4. 1SE rule details in CCP pruning of CART
  5. ASP渲染下拉框使时间依次减少
  6. prometheus 笔记
  7. jQuery Ajax - ajax()方法,参数注释
  8. 一些常用PLSQL语句 和事务
  9. Arduino 下载https://downloads.arduino.cc/packages/package_index.json时出错
  10. PyCharm快捷键
  11. 手机变蓝牙音响_微信官方收款音箱提示器收款码播报器S1 支付提示音响 无需wifi蓝牙 自带移动网络 手机不在店里也能播报...
  12. 搭建kafka集群详细步骤
  13. Unsupervised Degradation Representation Learning for Blind Super-Resolution(基于无监督退化表示学习的盲超分辨率处理)
  14. 影视短视频剪辑的完整操作流程(普通人也能学会)
  15. 2017cad光标大小怎么调_cad十字光标怎么调大-调整cad十字光标大小的方法 - 河东软件园...
  16. windows安装linux
  17. rtmp支持h265推流
  18. python是一种什么类型的植物_「蕨类植物」是一种什么类型的植物?
  19. 廖晓峰重庆大学计算机学院院长,重庆大学廖晓峰教授当选IEEE Fellow
  20. 3D游戏模型之3D max基础命令

热门文章

  1. QT5百度地图开发学习——qt调用JavaScript函数并传参
  2. 中间文字,两边横线css
  3. Linux C/C++ 对于SIGBUS、SIGSEGV等崩溃异常捕获实现
  4. python设置tk退出_Python3 tkinter基础 Tk quit 点击按钮退出窗体
  5. 人大金仓(kingbase8)安装与初始化超详细教程
  6. #内存泄露# linux常用内存相关命令
  7. 3.操作系统——CPU的实模式、保护模式和长模式
  8. 写交织(AXI4不在支持写交织功能)
  9. C语言——数组指针篇
  10. 为什么建议大家使用 Linux 开发?爽++