侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 674 篇文章
  • 累计创建 128 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录

【模拟】兰顿蚂蚁【蓝桥杯】

GabrielxD
2023-04-24 / 0 评论 / 0 点赞 / 102 阅读 / 937 字
温馨提示:
本文最后更新于 2023-04-24,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

兰顿蚂蚁 - 蓝桥云课


题目描述

兰顿蚂蚁,是于 1986 年,由克里斯·兰顿提出来的,属于细胞自动机的一种。

平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只"蚂蚁"。

蚂蚁的头部朝向为:上下左右其中一方。

蚂蚁的移动规则十分简单:

若蚂蚁在黑格,右转 90 度,将该格改为白格,并向前移一格;

若蚂蚁在白格,左转 90 度,将该格改为黑格,并向前移一格。

规则虽然简单,蚂蚁的行为却十分复杂。刚刚开始时留下的路线都会有接近对称,像是会重复,但不论起始状态如何,蚂蚁经过漫长的混乱活动后,会开辟出一条规则的"高速公路"。

蚂蚁的路线是很难事先预测的。

你的任务是根据初始状态,用计算机模拟兰顿蚂蚁在第 n 步行走后所处的位置。

输入描述

输入数据的第一行是 m,nm, n 两个整数 (3<m,n<100)(3 < m, n < 100) ,表示正方形格子的行数和列数。

接下来是 mm 行数据。

每行数据为 nn 个被空格分开的数字。0 表示白格,1 表示黑格。

接下来是一行数据: x,y,s,kx, y, s, k , 其中 x,yx, y 为整数,表示蚂蚁所在行号和列号(行号从上到下增长,列号从左到右增长,都是从 0 开始编号)。 ss 是一个大写字母,表示蚂蚁头的朝向,我们约定:上下左右分别用:U D L R 表示。 kk 表示蚂蚁走的步数。

输出描述

输出数据为两个空格分开的整数 p,qp,q , 分别表示蚂蚁在 kk 步后,所处格子的行号和列号。

输入输出样例

示例

输入

5 6
0 0 0 0 0 0
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
2 3 L 5

输出

1 3

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

解题

方法一:模拟

思路

按照题意直接模拟兰顿蚂蚁走的每一步即可。

注意:虽然题目中没有提到过,但是需要处理兰顿蚂蚁越界的情况,否则可能造成运行错误。蓝桥杯练习系统中虽然没有这种情况的样例,但如下输入就会导致兰顿蚂蚁越界:

4 4
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 L 100

代码

import java.util.*;
import java.io.*;

public class _兰顿蚂蚁 {
    static final int[][] DIRS = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
    static int[] mp = new int[256];
    static {
        mp['U'] = 0;
        mp['R'] = 1;
        mp['D'] = 2;
        mp['L'] = 3;
    }
    static int n, m;
    static boolean[][] g;
    static int x, y;
    static int s, k;

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        n = in.nextInt(); m = in.nextInt();
        g = new boolean[n][m];
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                g[i][j] = in.nextInt() == 0 ? false : true;
            }
        }
        x = in.nextInt(); y = in.nextInt();
        s = mp[in.next().charAt(0)]; k = in.nextInt();
        while (k-- > 0) {
            if (g[x][y]) {
                if (++s == 4) s = 0;
            } else {
                if (--s == -1) s = 3;
            }
            g[x][y] = !g[x][y];
            x += DIRS[s][0];
            y += DIRS[s][1];
            if (x >= n) --x;
            else if (x < 0) ++x;
            if (y >= m) --y;
            else if (y < 0) ++y;
        }
        System.out.println(x + " " + y);
    }
}
0

评论区