1.找路(okret)

题目描述

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

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

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

输入

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

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

输出

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

样例输入和输出

正解
很多人都会去用dfs,但我们还可以用暴力
我们只用判断每个路的四周,如果四周只有一条路,就说明是死胡同,直接输出1
AC代码

#include<iostream>
#include<cstdio>
using namespace std;
int r,c,s,m,a[105][105];
char ch;
int main()
{
   
	freopen("okret.in","r",stdin);
	freopen("okret.out","w",stdout);
	cin>>r>>c;
	for(int i=1;i<=r;i++)
	 for(int j=1;j<=c;j++)
	 {
   
	 	cin>>ch;//输入
	 	if(ch=='X')a[i][j]=1;else a[i][j]=2;
	 }
	for(int i=1;i<=r;i++)
	 for(int j=1;j<=c;j++)
	  if(a[i][j]==2)//下面是暴力(看四周有多少条路)
	  {
   
	 	s=0;
	 	if(a[i-1][j]==2)s++;
	 	if(a[i+1][j]==2)s++;
	 	if(a[i][j-1]==2)s++;
	 	if(a[i][j+1]==2)s++;
	 	if(s<2){
   m=1;break;}
	  } 
	cout<<m;  
	return 0;
}

下面附本次比赛的其他题目

2020.02.19普及C组模拟赛8(第一题)
2020.02.19普及C组模拟赛8(第二题)
2020.02.19普及C组模拟赛8(第三题)
2020.02.19普及C组模拟赛8(第四题)
2020.02.19普及C组模拟赛8(总结)

谢谢