一方通行与最后之作
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
学园都市仅有的七名超能力者(Level 5)排名第一位,能力为“矢量操作”,代号「一方通行(Accelerator)」。
某天,「最后之作」自己去商场玩耍,很晚还没有回来。「一方通行」很担心于是决定去找最后之作。
商场可以大体看作一个 N*M 的矩形,墙壁和遮挡物用 '*' 表示,空白位置用 '.' 表示,一方通行和最后之作的起始位置分别用 'A' 和 'L' 表示。(显然,他们两个人的起始位置是不可能有遮挡物的)
两人总共最多进行 K 次移动,每次移动可以用两个字符串 name 和 direction 来表示。
如果 name 为"Accelerator",表示本次是「一方通行」移动。
如果 name 为"LastOrder",表示本次是「最后之作」移动。
direction 可能为"up"或"down"或"left"或"right",分别表示向上、向下、向左、向右移动一个单位长度。
如果本次要移动的位置在商场外或者存在遮挡物,那么将不移动。如果两人中途已经相遇(坐标重合),那么之后的所有移动全部取消。
数据保证「一方通行」和「最后之作」会相遇,如果最后是「一方通行」走向「最后之作」请输出"Accelerator",如果是「最后之作」走向「一方通行」请输出"MisakaMisaka"。然后输出两人实际总共移动了多少步。
Input
首先输入两个正整数 N, M表示商场的大小。(2 <= N, M <= 100)
然后输入一个 N 行 M 列的字符矩阵。
下一行输入一个正整数 K,表示两人总共最多进行 K 次移动。 ( 1 <= K <= 100)
接下来 K 行,每行包括两个字符串,分别表示移动的角色和移动的方向。
Output
第一行输出一个字符串。
第二行输出一个正整数,表示两人实际总共移动了多少步相遇。
Sample Input
4 5
A.*..
..*..
..*..
....L
11
Accelerator down
LastOrder left
LastOrder right
LastOrder left
LastOrder left
Accelerator down
Accelerator down
Accelerator down
LastOrder up
LastOrder left
LastOrder left
Sample Output
MisakaMisaka
9
Hint
样例中,两人最终在第四行第一列相遇,最后一次移动是「最后之作」走向「一方通行」。
「一方通行」移动了3步,「最后之作」移动了6步,两人总共移动了9步。
Source
lxw
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x;
int y;
int step;
} a, l;
int main()
{
char s[111][111];
char name[15], go[15];
int n, m;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++)
{
int j;
for (j = 1; j <= m; j++)
{
// scanf(" %c", &s[i][j]); // %c前面没有空格会出错
cin >> s[i][j];
if (s[i][j] == 'A')
{
a.x = i;
a.y = j;
a.step = 0;
}
if (s[i][j] == 'L')
{
l.x = i;
l.y = j;
l.step = 0;
}
}
}
int t;
scanf("%d", &t);
int flag = 0;
while (t--)
{
scanf("%s %s", name, go);
if (name[0] == 'A' && flag == 0)
{
if (go[0] == 'u' && a.x - 1 >= 1 && s[a.x - 1][a.y] != '*')
{
a.x -= 1;
a.step++;
}
else if (go[0] == 'd' && a.x + 1 <= n && s[a.x + 1][a.y] != '*')
{
a.x += 1;
a.step++;
// cout << a.x << ' ' << a.y << endl;
}
// cout<<"test"<<endl;
else if (go[0] == 'l' && a.y - 1 >= 1 && s[a.x][a.y - 1] != '*')
{
a.y -= 1;
a.step++;
}
else if (go[0] == 'r' && a.y + 1 <= m && s[a.x][a.y + 1] != '*')
{
a.y += 1;
a.step++;
}
if (a.x == l.x && a.y == l.y)
{
flag = 1;
}
}
else if (name[0] == 'L'&& flag == 0)
{
if (go[0] == 'u' && l.x - 1 >= 1 && s[l.x - 1][l.y] != '*')
{
l.x -= 1;
l.step++;
}
else if (go[0] == 'd' && l.x + 1 <= n && s[l.x + 1][l.y] != '*')
{
l.x += 1;
l.step++;
}
else if (go[0] == 'l' && l.y - 1 >= 1 && s[l.x][l.y - 1] != '*')
{
l.y -= 1;
l.step++;
}
else if (go[0] == 'r' && l.y + 1 <= m && s[l.x][l.y + 1] != '*')
{
l.y += 1;
l.step++;
}
if (a.x == l.x && a.y == l.y)
{
flag = 2;
}
}
}
if (flag == 1)
printf("Accelerator\n");
else if (flag == 2)
printf("MisakaMisaka\n");
printf("%d\n", a.step + l.step);
return 0;
}
/***************************************************
User name: jk180602
Result: Accepted
Take time: 0ms
Take Memory: 208KB
Submit time: 2019-01-08 11:29:01
****************************************************/