• 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;
        }
    }
  • 相关阅读:
    什么是mybatis
    Oracle存储过程、游标、函数
    Oracle事务、视图、序列
    异步发送表单数据到JavaBean,并响应JSON文本返回
    结果的转发和重定向
    在业务控制方法中收集List<JavaBean>参数
    在业务控制方法中收集数组参数
    在业务控制方法中写入包装User的模型来收集参数
    在业务控制方法中写入User,Admin多个模型收集参数
    Linux内核分析:实验八--Linux进程调度与切换
  • 原文地址:https://www.cnblogs.com/dlvguo/p/12670494.html
Copyright © 2020-2023  润新知