(纪中)1920. 反射(mirror)【暴力】

(File IO): input:mirror.in output:mirror.out
时间限制: 1000 ms 空间限制: 128000 KB 具体限制
Goto ProblemSet


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


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

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


样例输入
3 3
/\
\\
//

样例输出
3


数据范围限制
1<=N,M<=1000。


提示
贝里斯的光如果从中间列的上方照射的话,将被反射3次。


解题思路
可以直接暴力模拟————把所有情况枚举一次(具体看程序),然后两个循环过。。
顺便提醒一下,是没有无限的情况的。。


代码

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
char c[1001][1001];
int ans,maxn,n,m,w,f;
int main()
{
    freopen("mirror.in","r",stdin);
  freopen("mirror.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
     for (int j=1;j<=m;j++)
      cin>>c[i][j];
     for (int i=1;i<=n;i+=n-1)
      for (int j=1;j<=m;j++)
        {
            if (i==1)f=1; 
            else f=3;
            ans=0;
            int x=i,y=j;
            while (i==i)
            {
                if (c[x][y]=='/'&&f==1&&y>=1) y--,f=4;
                else if (c[x][y]=='/'&&f==2&&x>=1) x--,f=3;
                else if (c[x][y]=='/'&&f==3&&y<=m) y++,f=2;
                else if (c[x][y]=='/'&&f==4&&x<=n) x++,f=1;
                else if (c[x][y]!='/'&&f==1&&y<=m) y++,f=2;
                else if (c[x][y]!='/'&&f==2&&x<=n) x++,f=1;
                else if (c[x][y]!='/'&&f==3&&y>=1) y--,f=4;
                else if (c[x][y]!='/'&&f==4&&x>=1) x--,f=3;
                else break;
                ans++;
                if (x<1||y<1||x>n||y>m) break;
            }
            if (ans>maxn) maxn=ans; 
        }
 
     for (int j=1;j<=m;j+=m-1)
      for (int i=1;i<=n;i++)
       {
            if (j==1)f=2; else f=4;
            ans=0;
            int x=i,y=j; 
            while (i==i)
            {
                if (c[x][y]=='/'&&f==1&&y>=1) y--,f=4;
                else if (c[x][y]=='/'&&f==2&&x>=1) x--,f=3;
                else if (c[x][y]=='/'&&f==3&&y<=m) y++,f=2;
                else if (c[x][y]=='/'&&f==4&&x<=n) x++,f=1;
                else if (c[x][y]!='/'&&f==1&&y<=m) y++,f=2;
                else if (c[x][y]!='/'&&f==2&&x<=n) x++,f=1;
                else if (c[x][y]!='/'&&f==3&&y>=1) y--,f=4;
                else if (c[x][y]!='/'&&f==4&&x>=1) x--,f=3;
                else break;
                ans++;
                if (x<1||y<1||x>n||y>m) break;
            }
            if (ans>maxn) maxn=ans; 
       }
    printf("%d",maxn);
}
发布了119 篇原创文章 · 获赞 8 · 访问量 4925

猜你喜欢

转载自blog.csdn.net/kejin2019/article/details/104774903
今日推荐