使用java模拟兰顿蚂蚁

简介: 使用java模拟兰顿蚂蚁

兰顿蚂蚁是一个经典的计算机科学问题,它模拟了一只蚂蚁在一个无限大的网格上移动的行为。下面是一个使用Java模拟兰顿蚂蚁的示例代码:

public class LangtonAnt {
   
    private int[][] grid;
    private int antX;
    private int antY;
    private int antDirection; // 0: up, 1: right, 2: down, 3: left

    public LangtonAnt(int size) {
   
        grid = new int[size][size];
        antX = size / 2;
        antY = size / 2;
        antDirection = 0;
    }

    public void run(int steps) {
   
        for (int i = 0; i < steps; i++) {
   
            flipColor();
            moveAnt();
            printGrid();
        }
    }

    private void flipColor() {
   
        if (grid[antY][antX] == 0) {
   
            grid[antY][antX] = 1;
            antDirection = (antDirection + 1) % 4;
        } else {
   
            grid[antY][antX] = 0;
            antDirection = (antDirection - 1 + 4) % 4;
        }
    }

    private void moveAnt() {
   
        switch (antDirection) {
   
            case 0: // up
                antY--;
                break;
            case 1: // right
                antX++;
                break;
            case 2: // down
                antY++;
                break;
            case 3: // left
                antX--;
                break;
        }
    }

    private void printGrid() {
   
        StringBuilder sb = new StringBuilder();
        for (int[] row : grid) {
   
            for (int cell : row) {
   
                sb.append(cell == 0 ? " " : "#");
            }
            sb.append("\n");
        }
        System.out.println(sb.toString());
    }

    public static void main(String[] args) {
   
        LangtonAnt ant = new LangtonAnt(20);
        ant.run(200);
    }
}

在这个示例代码中,首先定义了一个表示网格的二维数组grid,以及蚂蚁的当前位置antXantY,蚂蚁的当前朝向antDirection。在构造函数中,我们创建一个指定大小的网格,并将蚂蚁的初始位置设置为网格中心。

run方法模拟蚂蚁移动的过程。在每一步中,蚂蚁会根据当前所在位置的颜色进行翻转,然后根据当前朝向移动到下一个位置。最后,调用printGrid方法打印出当前网格的状态。

flipColor方法中,如果蚂蚁所在位置的颜色为0,则将其翻转为1,并将蚂蚁的朝向顺时针旋转90度;如果颜色为1,则将其翻转为0,并将蚂蚁的朝向逆时针旋转90度。

moveAnt方法中,根据当前朝向更新蚂蚁的坐标。

最后,在main方法中创建一个大小为20的网格,并模拟蚂蚁运动200步,输出每一步的网格状态。

相关文章
|
2月前
|
Java
【Java】蚂蚁迷宫问题
【Java】蚂蚁迷宫问题
24 0
|
7月前
|
消息中间件 缓存 Java
远程面试阿里、蚂蚁、京东、美团后整理份283页Java核心面试宝典
本文整理了一些面试时面试官必问的知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。
|
7月前
|
NoSQL Dubbo Java
网易开发三年,现跳槽蚂蚁花呗,4面顺利通过,拿下Java岗offer
不论是校招还是社招都避免不了各种面试、笔试,如何去准备这些东西就显得格外重要。 运筹帷幄之后,决胜千里之外!不打毫无准备的仗,我觉得大家可以先从下面几个方面来准备面试:
|
消息中间件 缓存 Java
远程面试阿里、蚂蚁、京东、美团后整理份283页Java核心面试宝典
本文整理了一些面试时面试官必问的知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。 由于知识点比较全面,内容比较多,所以我将这些Java面试中的核心知识点汇总整理成了一份文档。文档已经上传到了百度云网盘,文末提供获取方式~
|
数据格式
java_试题 历届真题】兰顿蚂蚁【第五届】【省赛】【C组】
平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只“蚂蚁”。   蚂蚁的头部朝向为:上下左右其中一方。
114 0
|
消息中间件 缓存 NoSQL
网易开发三年,现跳槽蚂蚁花呗,4面顺利通过,拿下Java岗offer
面试准备 不论是校招还是社招都避免不了各种面试、笔试,如何去准备这些东西就显得格外重要。 运筹帷幄之后,决胜千里之外!不打毫无准备的仗,我觉得大家可以先从下面几个方面来准备面试: 1. 自我介绍。(介绍自己的项目经历以及一些特长而不是简单自我介绍喜好等) 2. 自己面试中可能涉及哪些知识点、那些知识点是重点。 3. 面试中哪些问题会被经常问到、面试中自己该如何回答。 4. 自己的简历该如何写。
网易开发三年,现跳槽蚂蚁花呗,4面顺利通过,拿下Java岗offer
|
消息中间件 网络协议 关系型数据库
阿里蚂蚁集团JAVA一面
阿里蚂蚁集团JAVA一面
158 0
阿里蚂蚁集团JAVA一面
|
1天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
3天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
3天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。