FZU1019 猫捉老鼠

Problem Description 题目链接

一只猫和一只老鼠在10*10的迷宫中。迷宫中的每个方格可以是空的,或者含有障碍。猫和老鼠可以进入任意一个空的方格中。当他们相遇时,猫和老鼠在同一个方格中。但是,无论猫或老鼠都不能进入有障碍的方格。我们可以用字符组成的二维数组表示迷宫,如下图所示。

老鼠在迷宫中按照一种固定的方式行走:每个时刻,老鼠都向它所面对的方向前进一格,这需要花费1秒时间。如果前方是一个障碍或者是迷宫的边界,它将花1秒的时间按顺时针方向转90度。

为了抓到老鼠,这只猫决定也按照与老鼠相同的行走方式行进。

猫和老鼠在每个单位时间内是同时行动的。因此,如果猫和老鼠在行进过程中“擦肩而过”,猫是无法捉到老鼠的。只有当猫和老鼠同时到达一个相同的格子时,猫才能捉住老鼠。
初始时,猫和老鼠不会在同一个方格中。并且它们都面向北方。
你的任务是编一个程序,求出猫捉到老鼠的所花时间。

 Input

输入数据的第一行n,表示输入数据的组数。
每组数据由10行组成,每行10个字符,表示迷宫的地图以及猫和老鼠的初始位置。输入数据保证只有一只猫和一只老鼠。
每组输入数据之后均有一个空行作为间隔。

 Output

对于每组给定的输入,输出一行仅含一个数,即猫捉到老鼠所花的时间。如果猫永远都无法抓到老鼠,则输出0。

 Sample Input

1
*...*.....
......*...
...*...*..
..........
...*.c....
*.....*...
...*......
..m......*
...*.*....
.*.*......

 Sample Output

49

思路:记录猫和老鼠的坐标,模拟移动即可。判断猫永远无法抓住老鼠,就给一个数超过了这个数就跳出。

PS:一个大坑,多组数据的时候中间有回车间隔,不吸了这个回车就WA。

#include <iostream>
using namespace std;

char map[12][12];
//0 上 1右 2下 3左
int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};

struct Animal
{
    int x, y;
    int _dir;
};

int main()
{
    int n;
    scanf("%d", &n);
    int sum;
    Animal cat, mouse;
    while (n--)
    {
        getchar(); //注意细节 每行多了一个回车
        sum = 0;
        for (int i = 1; i < 11; i++)
        {
            for (int j = 1; j < 11; j++)
            {
                scanf("%c", &map[i][j]);
                if (map[i][j] == 'c')
                {
                    cat.x = i;
                    cat.y = j;
                    cat._dir = 0;
                }
                if (map[i][j] == 'm')
                {
                    mouse.x = i;
                    mouse.y = j;
                    mouse._dir = 0;
                }
            }
            getchar();
        }

        int _x, _y;
        while (cat.x != mouse.x || cat.y != mouse.y)
        {
            //获取猫一下步坐标 越界或者碰见障碍就改方向
            _x = cat.x + dir[cat._dir][0];
            _y = cat.y + dir[cat._dir][1];
            if (_x < 1 || _y < 1 || _x > 10 || _y > 10 || map[_x][_y] == '*')
            {
                cat._dir++;
                cat._dir %= 4;
            }
            else
            {
                cat.x = _x;
                cat.y = _y;
            }
            //获取猫一下步坐标 越界或者碰见障碍就改方向
            _x = mouse.x + dir[mouse._dir][0];
            _y = mouse.y + dir[mouse._dir][1];
            if (_x < 1 || _y < 1 || _x > 10 || _y > 10 || map[_x][_y] == '*')
            {
                mouse._dir++;
                mouse._dir %= 4;
            }
            else
            {
                mouse.x = _x;
                mouse.y = _y;
            }
            sum++;
            //超过500次 认为无法抓到
            if (sum > 500)
            {
                sum = 0;
                break;
            }
        }
        cout << sum << endl;
    }
}

 

posted @ 2020-04-09 23:25  国-哥  阅读(207)  评论(0编辑  收藏  举报