zoukankan      html  css  js  c++  java
  • 算法笔记_169:历届试题 兰顿蚂蚁(Java)

    目录

    1 问题描述

    2 解决方案

     


    1 问题描述

    问题描述


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

      平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只“蚂蚁”。
      蚂蚁的头部朝向为:上下左右其中一方。

      蚂蚁的移动规则十分简单:
      若蚂蚁在黑格,右转90度,将该格改为白格,并向前移一格;
      若蚂蚁在白格,左转90度,将该格改为黑格,并向前移一格。

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

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

      你的任务是根据初始状态,用计算机模拟兰顿蚂蚁在第n步行走后所处的位置。
    输入格式
      输入数据的第一行是 m n 两个整数(3 < m, n < 100),表示正方形格子的行数和列数。
      接下来是 m 行数据。
      每行数据为 n 个被空格分开的数字。0 表示白格,1 表示黑格。

      接下来是一行数据:x y s k, 其中x y为整数,表示蚂蚁所在行号和列号(行号从上到下增长,列号从左到右增长,都是从0开始编号)。s 是一个大写字母,表示蚂蚁头的朝向,我们约定:上下左右分别用:UDLR表示。k 表示蚂蚁走的步数。
    输出格式
      输出数据为两个空格分开的整数 p q, 分别表示蚂蚁在k步后,所处格子的行号和列号。
    样例输入
    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
    样例输入
    3 3
    0 0 0
    1 1 1
    1 1 1
    1 1 U 6
    样例输出
    0 0

    2 解决方案

    具体代码如下:

     

    import java.util.Scanner;
    
    public class Main {
        public static String Black = "URDL";
        public static String Write = "ULDR";
        public static int m, n;
        public static int[][] map;
        
        public void getResult(int x, int y,  String s, int k) {
            for(int i = 0;i < k;i++) {
                if(map[x][y] == 0) {  //白格
                    map[x][y] = 1;  //变为黑格
                    int index = Write.indexOf(s);
                    index = (index + 1) % 4;
                    s = "" + Write.charAt(index);        
                } else if(map[x][y] == 1) {  //黑格
                    map[x][y] = 0;
                    int index = Black.indexOf(s);
                    index = (index + 1) % 4;
                    s = "" + Black.charAt(index);
                }
                if(s.equals("U"))
                    x = x - 1;
                else if(s.equals("L"))
                    y = y - 1;
                else if(s.equals("D"))
                    x = x + 1;
                else if(s.equals("R"))
                    y = y + 1;
            }
            System.out.println(x+" "+y);
        }
        
        public static void main(String[] args) {
            Main test = new Main();
            Scanner in = new Scanner(System.in);
            m = in.nextInt();
            n = in.nextInt();
            map = new int[m][n];
            for(int i = 0;i < m;i++)
                for(int j = 0;j < n;j++)
                    map[i][j] = in.nextInt();
            int x = in.nextInt();
            int y = in.nextInt();
            String s = in.next();
            int k = in.nextInt();
            test.getResult(x, y, s, k);
        }
    }
  • 相关阅读:
    centos7
    aaa
    20199122 2019-2020-2 《网络攻防实践》第三周作业
    20189304李小涛网络攻防第二周作业
    20189304《网络攻防》第一周作业
    2019-2020-2 20199137 《网络攻防实践》第三次作业
    容器抓包方法
    打印输出10分钟日志内容
    linux shell 检查脚本参数
    Structure needs cleaning(结构需要清理)解决
  • 原文地址:https://www.cnblogs.com/liuzhen1995/p/6800441.html
Copyright © 2011-2022 走看看