DFS:王子救公主

简介: DFS:王子救公主

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


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


输入格式


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


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


输出格式


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


样例输入


1 8


w....#.g


样例输出


yes

 


该问题比较复杂,需要两个dfs分别记录王子和公主能到达的位置,然后遍历是否有重合的部分,如果有证明能够逃走。为了方便理解,小编写了两个dfs函数,没有合为一个,并且将王子和公主能到达的位置打印出来。

#include <iostream>
using namespace std;
int n,m;
char a[105][105]; 
bool wz[105][105];
bool gz[105][105];
void dfsw(int x,int y){
  if(x<0 || x>=n || y<0 || y>=m || wz[x][y]==1) {
    return;
  }
  wz[x][y]=1;
  dfsw(x+2,y);
  dfsw(x-2,y);
  dfsw(x,y-2);
  dfsw(x,y+2);
}
void dfsg(int x,int y){
  if(x<0 || x>=n || y<0 || y>=m || a[x][y]=='#' || gz[x][y]==1){
    return;
  }else{
  gz[x][y]=1;
  dfsg(x+1,y);
  dfsg(x-1,y);
  dfsg(x,y+1);
  dfsg(x,y-1);
  }
}
int main(){
  int wx,wy,gx,gy;
  cin>>n>>m;
  for(int i=0;i<n;i++){
    for(int j=0;j<m;j++){
      cin>>a[i][j];
    }
  }
  for(int i=0;i<n;i++){
    for(int j=0;j<m;j++){
      if(a[i][j]=='w'){
        wx=i;
        wy=j;
      }
      if(a[i][j]=='g'){
        gx=i;
        gy=j;
      }
    }
  }
  dfsw(wx,wy);
  dfsg(gx,gy);
  cout<<"--------------------"<<endl;
  cout<<"王子能到达的位置:"<<endl;
  for(int i=0;i<n;i++){
    for(int j=0;j<m;j++){
      cout<<wz[i][j];
    }
    cout<<endl;
  }
  cout<<endl; 
  cout<<"--------------------"<<endl;
  cout<<"公主能到达的位置:"<<endl;
  for(int i=0;i<n;i++){
    for(int j=0;j<m;j++){
      cout<<gz[i][j];
    }
    cout<<endl; 
  }
  for(int i=0;i<n;i++){
    for(int j=0;j<m;j++){
      if(wz[i][j]&&gz[i][j]){
        cout<<"yes";
        return 0;
      }
    }
  }
  cout<<"no";
  return 0; 
} 

相关文章
|
4月前
|
算法
人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。
这篇文章介绍了解决LeetCode第一题"两数之和"的方法,提供了题目的描述、输入输出示例,并给出了解决这个问题的算法思路。
牛客练习赛87 牛老板 (记忆化搜索)
牛客练习赛87 牛老板 (记忆化搜索)
133 0
|
机器学习/深度学习
学霸、学神OR开挂
我们学习知识 好比武侠世界里的人修炼武功一般 有人天赋异禀、骨骼清奇 是天生的练武奇才——学神 有人天资平庸,但通过后天的孜孜不倦 终成一代大侠——学霸 还有人一路奇遇不断,屡获高人指点 成为绝世高手——外挂玩家
学霸、学神OR开挂
A计划救公主
可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
191 0
|
存储 算法
有人相爱,有人夜里开车看海,有人LeetCode第一题都做不出来
有人相爱,有人夜里开车看海,有人LeetCode第一题都做不出来
427 0
有人相爱,有人夜里开车看海,有人LeetCode第一题都做不出来
|
JavaScript 前端开发 Java
一入前端深似海,从此红尘是路人系列第一弹之浅析JavaScript继承
继承算是JavaScript中的一大难点也是必须掌握的知识点。接下来我会列举一些我们常见的继承并给出对应一些的code方便大家理解。
1511 0