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(总结)
谢谢
来源:CSDN
作者:SSL_李恪佳
链接:https://blog.csdn.net/weixin_45524309/article/details/104544409