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; 
} 

相关文章
|
29天前
|
算法
人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。
这篇文章介绍了解决LeetCode第一题"两数之和"的方法,提供了题目的描述、输入输出示例,并给出了解决这个问题的算法思路。
|
4月前
|
JSON 数据格式
星系炸弹(蓝桥杯)
星系炸弹(蓝桥杯)
|
4月前
洛古 P1002 过河卒
洛古 P1002 过河卒
|
4月前
国王的魔镜
国王的魔镜
45 0
|
存储 算法 NoSQL
膜拜!砍下13个大厂Offer神仙案例! | 彭文华
膜拜!砍下13个大厂Offer神仙案例! | 彭文华
|
算法 C++
【每日算法Day 65】你能顺利救出地下城里的公主吗?
【每日算法Day 65】你能顺利救出地下城里的公主吗?
|
测试技术
杭电1232 畅通工程
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
141 0
|
算法
每日一题冲刺大厂 第二十三天 奶牛晒衣服
大家好,我是泡泡,给大家带来每日一题的目的是为了更好的练习算法,我们的每日一题为了让大家练到各种各样的题目,熟悉各种题型,一年以后,蜕变成为一个不一样的自己!
124 0
|
算法
每日一题冲刺大厂提高组 第二十四天 胖胖的奶牛
大家好,我是泡泡,给大家带来每日一题的目的是为了更好的练习算法,我们的每日一题为了让大家练到各种各样的题目,熟悉各种题型,一年以后,蜕变成为一个不一样的自己!
79 0
A计划救公主
可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
179 0