SDUTOJ4384_一方通行与最后之作(18级期末上机考试二)

一方通行与最后之作

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

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
****************************************************/

 

转载于:https://www.cnblogs.com/iQXQZX/p/10258737.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值