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<iostream>
#include<cstdio>
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(总结)