題目描述:
一天,蒜頭君夢見自己當上了王子,但是不幸的是,自己的公主被可惡的巫婆抓走了。於是蒜頭君動用全國的力量得知,自己的公主被巫婆抓進一個迷宮裏面。由於全國只有蒜頭君自己可以翻越迷宮外的城牆,蒜頭君便自己一人走上的拯救自己公主的路途。
碰巧的是巫婆出去了,迷宮也不大,蒜頭君可以直接和公主對話,於是兩個人便開始相互靠近。每一步移動只能朝着上下左右四個方向走一格,不能走進牆所在的位置。蒜頭君救公主心切,一次必須沿着一個方向走兩步(允許跨越迷宮中的牆);公主柔弱,一次只能走一步。問在這個迷宮中,蒜頭君是否可以救出公主(蒜頭君和公主相遇後,就能揹着公主逃出迷宮了)。
輸入格式
第一行輸入兩個整數 n(1≤n≤100), m(1≤m≤100) 表示迷宮的行和列。
然後有一個 n×m 的地圖,地圖由’.’、’#’、‘w’、‘g’這四個部分組成。’.‘表示可以通行的路,’#'表示迷宮的牆,'w’表示王子開始所在的位置,'g’表示公主開始所在的位置。
輸出格式
輸出王子是不可以救出自己的公主,如果能救出則輸出"yes",否則輸出"no"。
樣例輸入
1 8
w…#.g
樣例輸出
yes
解題思路:
深搜,搜索到王子和公主可以走得到的所有位置,如果有重疊的位置,則輸出yes,否則,輸出no。
AC代碼:
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <vector>
#include <string.h>
#include <math.h>
using namespace std;
char map[105][105];
int vis1[105][105];//王子的足跡
int vis2[105][105];//公主的足跡
int n,m;
bool in(int x,int y)
{
return x>=0&&x<n&&y>=0&&y<m;
}
void dfs(int x,int y,bool prince)//prince表示是否是王子
{
if(!in(x,y)||map[x][y]=='#')
return ;
if(prince)
{
if(vis1[x][y])
return ;
}
else
{
if(vis2[x][y])
return ;
}
int step;
if(prince)
{
step=2;
vis1[x][y]=1;
}
else
{
step=1;
vis2[x][y]=1;
}
//準備向四個方向繼續走
dfs(x,y+step,prince);
dfs(x+step,y,prince);
dfs(x,y-step,prince);
dfs(x-step,y,prince);
}
int main()
{
int i,j;
cin>>n>>m;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>map[i][j];
//'.'表示可以通行的路,'#'表示迷宮的牆,'w'表示王子開始所在的位置,'g'表示公主開始所在的位置
//公主一次走一步,王子一次走兩步
int x1,y1;//王子的起止位置
int x2,y2;//公主的起始位置
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(map[i][j]=='w')
{
x1=i;
y1=j;
}
if(map[i][j]=='g')
{
x2=i;
y2=j;
}
}
dfs(x1,y1,true);//王子開始走
dfs(x2,y2,false);//公主開始走
int flag=0;//標記王子是否可以救出公主
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(vis1[i][j]&&vis2[i][j])
{
flag=1;
break;
}
}
}
if(flag)//可以救出公主
cout<<"yes"<<endl;
else//不可以救出公主
cout<<"no"<<endl;
return 0;
}