找路(okret)

找路(okret)

题目描述

Mirko 刚开始学车,因此他还不会在一个很狭窄的地方掉头,所以他想找一个不需要掉头的地
方学车。Mirko马上发现他想找的地方必须没有死胡同,因为死胡同是不可能出来的,除非掉
头(假设Mirko也不会倒车)。现在,你需要写一个程序,来分析一个地方的地图,研究是否
这个地方适合Mirko练习开车。
这张地图是包含R*C个单元格的,单元格中的“X”代表一个建筑物,单元格中的“.”代表路面。从
一个路面单元格,Mirko可以向旁边上下左右四个方向的单元格开去,只要开过去的地方同样
也是路面。
最后,我们要得出这个地图是否包含死胡同,假如从任意一个路面单元格出发,沿着任何
一个可以行驶的方向,我们可以不用掉头就能返回到出发点,那么这个地图就是没有死
胡同的。

输入

第一行包括两个整数R和C(3<=R,C<=10),表示这个地图的大小。

接下来R行,每行有C个字符,每个字符可能是“X”和“.”。地图中至少有两个路面单元格,并
且所有的路面都是相连的(相互可达的)。

输出

 输出只有一行,输出0表示这个地图没有死胡同,输出1表示这个地图存在死胡同。 

样例输入
4 3
XXX
X.X
X.X
XXX
样例输出
1

其实这道题并没有大家想想象的那么难

在地图中对于每一个路面,我们进行一下操作。
判断当前这个路面的四个方向(上,下,左,右)是否有三面墙(如图一),也就说明是个死胡同,则直接输出一,因为只要判断是否有死胡同,不需要知道有几条。如果没有输出,则程序最后输出0即可。


图一

code:

#include <cstdio>
#include <iostream>
using namespace std;
char a[20][20];
int main()
{
	freopen("okret.in","r",stdin);
	freopen("okret.out","w",stdout);
	int r,c;
	cin>>r>>c;
	for(int i=1 ; i<=r ; i++)
	for(int j=1 ; j<=c ; j++)
	 	cin>>a[i][j];
	int s; 
	for(int i=1 ; i<=r ; i++)
	 {
	 	for(int j=1 ; j<=c ; j++)
	 	 {
	 		if(a[i][j]=='.')  //注意只有当前点是路面时,才可以。
			 {
				s=0;
				if(a[i-1][j]=='.') s++;  //上面
				if(a[i+1][j]=='.') s++;  //下面
				if(a[i][j-1]=='.') s++;  //左面
				if(a[i][j+1]=='.') s++;  //右面
				if(s<2)   //表示是否只有一条路可以走,其实与是否有三面墙同理。
				 { 
					cout<<1<<endl;
					return 0;	
				 }	 	
			 }	
		 }
	 }
	cout<<0<<endl;
	return 0;
}

谢谢

发布了80 篇原创文章 · 获赞 58 · 访问量 2528

猜你喜欢

转载自blog.csdn.net/bigwinner888/article/details/104425528