题目描述
Porter 在浅水上完成了他的 MV,但他很快发现了事情不对:他的话筒进水了。
Porter 的话筒内部的关键电子元件可以被看作一个 n\times mn×m 的二维平面。我们用一张 n\times mn×m 的字符画来表示 Porter 的话筒内部状况,其中有三种不同的字符:
.表示空位
x表示关键电子原件
o表示水滴
水滴会沿着重力方向一直流动,直到流出边界或者流到电子原件上。当水滴流到任意一个电子原件上时,Porter 的话筒就会坏掉。Porter 慌忙把话筒转过来,改变了话筒内部的重力方向。重力方向用四种字符之一表示:^v<>,分别对应上下左右。
Porter 想知道,在这种重力方向下,他的话筒过一会儿会不会 GG。
输入格式
第一行两个正整数和一个字符,分别代表 nn、mm 和重力方向。
接下来 nn 行,每行 mm 个字符,分别对应代表该点状态。
输出格式
输出一行一个字符串。GG 代表 Porter 的话筒会坏掉,OK 代表不会。
输入输出样例
输入 #1复制
3 3 v
.o.
…
xxx
输出 #1
GG
输入 #2
3 3 >
…
o.x
…
输出 #2
GG
输入 #3
3 3 ^
.o.
…
xxx
输出 #3
OK
说明/提示
样例解释
样例一:第一行第二列的水滴向下流到了最后一行第二列的电子原件上,因此话筒坏掉了。
样例二:第二行第一列的水滴向右流到了第二行最后一列的电子原件上,因此话筒坏掉了。
样例三:第一行第二列的水滴直接向上流出话筒,因此 Porter 的话筒不会坏掉。
数据范围
对于全部数据,保证 1\le n,m\le 1001≤n,m≤100,且输入数据合法。
Subtask 1 (10 pts):话筒中没有 x(即电子原件)。
Subtask 2 (10 pts):话筒中没有 o(即水滴)。
Subtask 3 (30 pts):保证重力方向总是 v(向下)。
Subtask 4 (50 pts):无特殊限制。
没错,很暴力就能解决。
但是,思维容易觉得只有一个水滴(虽然样例没有给出多多水滴应该是引导我们入这个坑),在暴力的时候千万要考虑多水滴情况就好了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
#define M 400
using namespace std;
int n,m;
int x=-1,y=-1;
char a[1000][1000],c;
int b[1000][4],tot=0;
bool judge = true;
void work()
{
if( c=='v' )
{
for(int j=x;j<=n;j++)
{
if( a[j][y] == 'x' )
{
judge = false;
return ;
}
}
}
if( c=='^' )
{
for(int j=x;j>=1;j--)
{
if( a[j][y] == 'x' )
{
judge = false;
return ;
}
}
}
if( c=='<' )
{
for(int j=y;j>=1;j--)
{
if( a[x][j]=='x' )
{
judge = false;
return ;
}
}
}
if( c=='>' )
{
for(int j=y;j<=m;j++)
{
if( a[x][j]=='x' )
{
judge = false;
return ;
}
}
}
}
int main()
{
cin>>n>>m>>c;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if( a[i][j] == 'o' )
{
tot++;
b[tot][1]=i;
b[tot][2]=j;
}
}
}
if(tot!=0)
for(int i=1;i<=tot;i++)
{
x = b[i][1];
y = b[i][2];
if(judge==true) work();
}
if( judge==false ) printf("GG\n");
else printf("OK\n");
return 0;
}