【jzoj1669】找路(okret)

题目描述

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

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

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

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

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

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

提示
【jzoj1669】找路(okret)_第1张图片


解题思路

死胡同就是除来路的另三个面都不可以走,那么就判断每个点有没有两个可走的面


#include<iostream>
#include<cstdio>
using namespace std;
const int way[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int n,m;
char a[20][20];
int main(){
	//freopen("okret.in","r",stdin);
	//freopen("okret.out","w",stdout);
	scanf("%d%d",&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]=='X')continue;
        	int t=0;
        	for(int k=0;k<4;k++)
        	   if(a[i+way[k][0]][j+way[k][1]]=='.')++t;
        	if(t<2){
        		printf("1");
        		return 0;
			}
		}
	printf("0");
} 

你可能感兴趣的:(【jzoj1669】找路(okret))