题目描述
Mirko 刚开始学车,因此他还不会在一个很狭窄的地方掉头,所以他想找一个不需要掉头的地方学车。Mirko马上发现他想找的地方必须没有死胡同,因为死胡同是不可能出来的,除非掉头(假设Mirko也不会倒车)。现在,你需要写一个程序,来分析一个地方的地图,研究是否这个地方适合Mirko练习开车。
这张地图是包含R*C个单元格的,单元格中的“X”代表一个建筑物,单元格中的“.”代表路面。从一个路面单元格,Mirko可以向旁边上下左右四个方向的单元格开去,只要开过去的地方同样也是路面。
最后,我们要得出这个地图是否包含死胡同,假如从任意一个路面单元格出发,沿着任何一个可以行驶的方向,我们可以不用掉头就能返回到出发点,那么这个地图就是没有死胡同的。
输入
第一行包括两个整数R和C(3<=R,C<=10),表示这个地图的大小。
接下来R行,每行有C个字符,每个字符可能是“X”和“.”。地图中至少有两个路面单元格,并且所有的路面都是相连的(相互可达的)。
输出
输出只有一行,输出0表示这个地图没有死胡同,输出1表示这个地图存在死胡同。
分析
因为数据太小,所以我选择直接遍历。首先,死胡同的特点:三面是墙。
三面是**墙(包括超过范围的边界)**有几种情况:
- 左上右
- 上右下
- 右下左
- 下左上
只要每个点都这样判断就可以啦!
上代码
#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;
}