洛谷 P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two

话不多说上代码

import java.util.Scanner;

/**
 * @author congege
 * @create 2023:04:26 5:35
 * @describe https://www.luogu.com.cn/problem/P1518
 * 两只塔姆沃斯牛 The Tamworth Two
 * 做的不好
 */
public class Main {
    public static int[][] orientation = new int[4][2];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = 10;
        int m = 10;
        char[][] map = new char[m][n];


        // 为了顺时针的上 右 下 左
        // 向上
        orientation[0] = new int[]{-1, 0};
        // 向右
        orientation[1] = new int[]{0, 1};
        // 向下
        orientation[2] = new int[]{1, 0};
        // 向左
        orientation[3] = new int[]{0, -1};

        // 画出牧场
        String row;
        for (int i = 0; i < m; i++) {
            row = sc.nextLine();
            map[i] = row.toCharArray();
        }

        // 数组设置成三个,第三个表示方向,方便修改
        int[] farmerXY = new int[3];
        int[] cowXY = new int[3];


        // 找到F C 位置
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (map[i][j] == 'F') {
                    farmerXY[0] = i;
                    farmerXY[1] = j;
                }
                if (map[i][j] == 'C') {
                    cowXY[0] = i;
                    cowXY[1] = j;
                }
            }
        }


        int step = 0;
        while (cowXY[0] != farmerXY[0] || cowXY[1] != farmerXY[1]) {
            step++;
//            map[cowXY[0]][cowXY[1]]='.';
            move(map, cowXY);
//            map[cowXY[0]][cowXY[1]] = 'C';
//            map[farmerXY[0]][farmerXY[1]] = '.';
            move(map, farmerXY);
//            map[farmerXY[0]][farmerXY[1]] = 'F';
//            show(map);
            // 为什么当步骤大于160005时就表示找不到了
            // 每一个物体方向时4个,100个格子,就是有400种可能
            // 两个一共400 * 400 = 160000
            // 但是我们需要超过他一点,确保
            if (step >= 160005) {
                System.out.println(0);
                return;
            }
        }
        System.out.println(step);
    }

    /**
     * 移动一次或者转向
     *
     * @param map    牧场
     * @param object 需要移动的物体
     */
    public static void move(char[][] map, int[] object) {
        int stepX = object[0] + orientation[object[2]][0];
        int stepY = object[1] + orientation[object[2]][1];
        // 遇到上边界或者是左边界
        if (stepX == -1 || stepY == -1) {
            object[2] = (object[2] + 1) % orientation.length;
            return;
        }
        // 遇到右边界或者是下边界
        if (stepX == map.length || stepY == map.length) {
            object[2] = (object[2] + 1) % orientation.length;
            return;
        }
        // 遇到障碍物
        if (map[stepX][stepY] == '*') {
            object[2] = (object[2] + 1) % orientation.length;
            return;
        }
        object[0] = stepX;
        object[1] = stepY;
    }
    
    // 展示 方便 查看 每一步骤
    public static void show(char[][] map) {
        int n = map.length;
        int m = map[0].length;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
    }
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值