2020寒假【gmoj1669】【找路okret】

题目描述

Mirko 刚开始学车,因此他还不会在一个很狭窄的地方掉头,所以他想找一个不需要掉头的地方学车。Mirko马上发现他想找的地方必须没有死胡同,因为死胡同是不可能出来的,除非掉头(假设Mirko也不会倒车)。现在,你需要写一个程序,来分析一个地方的地图,研究是否这个地方适合Mirko练习开车。

这张地图是包含R*C个单元格的,单元格中的“X”代表一个建筑物,单元格中的“.”代表路面。从一个路面单元格,Mirko可以向旁边上下左右四个方向的单元格开去,只要开过去的地方同样也是路面。

最后,我们要得出这个地图是否包含死胡同,假如从任意一个路面单元格出发,沿着任何一个可以行驶的方向,我们可以不用掉头就能返回到出发点,那么这个地图就是没有死胡同的。

输入

第一行包括两个整数R和C(3<=R,C<=10),表示这个地图的大小。
接下来R行,每行有C个字符,每个字符可能是“X”和“.”。地图中至少有两个路面单元格,并且所有的路面都是相连的(相互可达的)。

输出

输出只有一行,输出0表示这个地图没有死胡同,输出1表示这个地图存在死胡同。
在这里插入图片描述

分析

因为数据太小,所以我选择直接遍历。首先,死胡同的特点:三面是墙
三面是**墙(包括超过范围的边界)**有几种情况:

  1. 左上右
  2. 上右下
  3. 右下左
  4. 下左上
    只要每个点都这样判断就可以啦!

上代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,f;
char a[10][15]; 
int main()
{
	freopen("okret.in","r",stdin);
	freopen("okret.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
    	for(int j=1;j<=m;j++)
    	{
    		cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(a[i][j]=='.')
			{
				if((a[i][j-1]=='X'||j-1<1)&&(a[i-1][j]=='X'||i-1<1)&&(a[i][j+1]=='X'||j+1>m))
				{
					cout<<1;
					f=1;
					break;
				}
				else if((a[i-1][j]=='X'||i-1<1)&&(a[i][j+1]=='X'||j+1>m)&&(a[i+1][j]=='X'||i+1>n))
				{
					cout<<1;
					f=1;
					break;
				}
				else if((a[i][j+1]=='X'||j+1>m)&&(a[i+1][j]=='X'||i+1>n)&&(a[i][j-1]=='X'||j-1<1))
				{
					cout<<1;
					f=1;
					break;
				}
				else if((a[i-1][j]=='X'||i-1<1)&&(a[i][j-1]=='X'||j-1<1)&&(a[i+1][j]=='X'||i+1>n))
				{
					cout<<1;
					f=1;
					break;
				}
			}
		}
		if(f==1) break;
	}
	if(f==0) cout<<0;
	fclose(stdin);
	fclose(stdout);
    return 0;
}
发布了63 篇原创文章 · 获赞 61 · 访问量 5437

猜你喜欢

转载自blog.csdn.net/dglyr/article/details/104439596
今日推荐