2020.03.08模拟赛14(第一题)

1.反射(mirror)

题目描述

农夫约翰把他的很多镜子遗落在房子外面,他的奶牛们对这些镜子很好奇,于是奶牛们把这些镜子偷了!
奶牛们把镜子放在了一个N*M的矩阵中,在每个小方格中,他们将镜子按正对角线或者反对角线的方式放置,也就是说镜子的放置形状要么是’/’,要么是’\’。
某一天晚上,奶牛贝里斯拿着一个手电筒站在矩阵的外面,他打开手电筒按水平或者垂直方向朝矩阵内的镜子照射,由于镜子是对角线或者反对角线放置的,所以如果垂直的光过来的话,反射出来的光就是水平的,反之也是同样的道理。贝里斯想要知道他从外面照过来的光最多能被镜子反射几次。

输入

第一行是两个正整数N和M,表示矩阵的大小。
接下里N行,每行M个字符,表示矩阵内镜子放置的情况。字符是’/’或者’\’。

输出

输出一个整数,表示从外面照射进来的一束光最多能在矩阵内被反射的次数,如果会被反射无限次,就输出-1。

样例输入

3 3
/\
\\
//

样例输出

3

数据范围限制

【数据规模】
1<=N,M<=1000。

提示

【样例说明】
贝里斯的光如果从中间列的上方照射的话,将被反射3次。

正解
不会有-1的情况(因为图不可能是闭合的)
被光照到有8种情况

  1.2.3.   4.   5.6.7.   8.//   //←    \→   \←   →\    ←\
               ↑    ↓                ↓     ↑

我们暴力枚举每一个边缘,然后再暴力找出从这个点射入会最多反射的次数,最后找出最大值就OK

我这里
f=1 表示光往上射
f=2 表示光往下射
f=3 表示光往左射
f=4 表示光往右射
上下左右

AC代码

#include
#include
using namespace std;
int n,m,f,m1,mmax,a[1005][1005];
char ch;
int main()
{
	//freopen("mirror.in","r",stdin);
	//freopen("mirroar.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
     {
		cin>>ch;
		if(ch=='/')a[i][j]=1;
	 }
    for(int i=1;i<=2;i++)//枚举上下边缘
	 for(int j=1;j<=m;j++)
	 {
	 	int x,y=j,m1=0;
    	if(i==1){f=2;x=1;}else{f=1;x=n;}//初始的光的方向
    	while(x>=1&&x<=n&&y>=1&&y<=m)//暴力找次数
    	{
    		if(a[x][y]==1&&f==1){y++;f=4;}
    		else if(a[x][y]==1&&f==2){y--;f=3;}
    		else if(a[x][y]==1&&f==3){x++;f=2;}
    		else if(a[x][y]==1&&f==4){x--;f=1;}
    		else if(a[x][y]==0&&f==1){y--;f=3;}
    		else if(a[x][y]==0&&f==2){y++;f=4;}
    		else if(a[x][y]==0&&f==3){x--;f=1;}
    		else if(a[x][y]==0&&f==4){x++;f=2;}
    		else break;
    		m1++;
		}
		mmax=max(m1,mmax);//找最大值
	 }
	for(int i=1;i<=2;i++)//枚举左右边缘
	 for(int j=1;j<=n;j++)
	 {
	 	int x=j,y,m1=0;
    	if(i==1){f=4;y=1;}else{f=3;y=m;}//初始光的方向
    	while(x>=1&&x<=n&&y>=1&&y<=m)//暴力找次数
    	{
    		if(a[x][y]==1&&f==1){y++;f=4;}
    		else if(a[x][y]==1&&f==2){y--;f=3;}
    		else if(a[x][y]==1&&f==3){x++;f=2;}
    		else if(a[x][y]==1&&f==4){x--;f=1;}
    		else if(a[x][y]==0&&f==1){y--;f=3;}
    		else if(a[x][y]==0&&f==2){y++;f=4;}
    		else if(a[x][y]==0&&f==3){x--;f=1;}
    		else if(a[x][y]==0&&f==4){x++;f=2;}
    		else break;
    		m1++;
		}
		mmax=max(m1,mmax);//最大值
	 } 
	cout<<mmax; 
	return 0;
}

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

2020.03.08模拟赛14(第一题)
2020.03.08模拟赛14(第二题)
2020.03.08模拟赛14(第三题)
2020.03.08模拟赛14(第四题)
2020.03.08模拟赛14(总结)

谢谢

你可能感兴趣的:(赛后分析)