計蒜客:王子救公主---dfs

題目描述:

一天,蒜頭君夢見自己當上了王子,但是不幸的是,自己的公主被可惡的巫婆抓走了。於是蒜頭君動用全國的力量得知,自己的公主被巫婆抓進一個迷宮裏面。由於全國只有蒜頭君自己可以翻越迷宮外的城牆,蒜頭君便自己一人走上的拯救自己公主的路途。
碰巧的是巫婆出去了,迷宮也不大,蒜頭君可以直接和公主對話,於是兩個人便開始相互靠近。每一步移動只能朝着上下左右四個方向走一格,不能走進牆所在的位置。蒜頭君救公主心切,一次必須沿着一個方向走兩步(允許跨越迷宮中的牆);公主柔弱,一次只能走一步。問在這個迷宮中,蒜頭君是否可以救出公主(蒜頭君和公主相遇後,就能揹着公主逃出迷宮了)。
輸入格式
第一行輸入兩個整數 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章