(ファイルIO):入力:mirror.in出力:mirror.out
制限時間:1000ミリ秒のスペースの制約:128000キロバイトの特定の制限
後藤ProblemSet
タイトル説明
ファーマージョンは家の外に鏡の中の彼の左嘘の多くを置く牛が盗まれたので、彼の牛は、これらのミラーこれらのミラーについて非常に興味があります!
aの上に牛ミラー
行列は、各小箱に、それらは、ミラーの対角線または反対角線正方法が配置されるか配置されるミラーの形状を押し
またはである'\'。
対角線または反対角線ミラーが配置されているので、一晩、マトリックスの外に立っベリーズ牛を保持懐中電灯は、彼は、照明マトリックスにおけるミラーの水平方向または垂直方向により懐中電灯を開くので、垂直光もし来て、同じことが真であるのに対し、その後、反射光のレベルです。彼は光を複数回反射鏡を考え出すことができる外部から知りたいとベリーズ。
入力
最初の二行のは、正の整数であります
と
、行列のサイズを表します。
引き継ぎました
行、各行
文字は、ミラーは、マトリックス内に配置されている場合を示しています。文字があります
や'\'。
出力
外部から照射される光の入射ビームの数を表す整数行列まで反射される出力は、無制限、出力場合に反射されます
。
サンプル入力
33
/ \
\\
//
サンプル出力
3
データ範囲の制限
1 <= N、M <= 1000
先端
ベリーズ場合光は中段上方から照射され、それは三回反射されます。
アイデアは、問題解決
に直接----列挙一度暴力のすべてのケースをシミュレートすることができます(特定のプログラムを参照)、その後、2サイクルの前に。。
ちなみに無限の状況ではない、あなたを思い出させます。。
コード
#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);
}