[java]极大极小游戏

题目描述

给你一个下标从 0 开始的整数数组 nums ,其长度是 2 的幂。

对 nums 执行下述算法:

设 n 等于 nums 的长度,如果 n == 1 ,终止 算法过程。否则,创建 一个新的整数数组 newNums ,新数组长度为 n / 2 ,下标从 0 开始。
对于满足 0 <= i < n / 2 的每个 偶数 下标 i ,将 newNums[i] 赋值 为 min(nums[2 * i], nums[2 * i + 1]) 。
对于满足 0 <= i < n / 2 的每个 奇数 下标 i ,将 newNums[i] 赋值 为 max(nums[2 * i], nums[2 * i + 1]) 。
用 newNums 替换 nums 。
从步骤 1 开始 重复 整个过程。
执行算法后,返回 nums 中剩下的那个数字。

Coding

class Solution {
    public int f(List<Integer> s){
        var t=new ArrayList<Integer>();
        int flag=0;
        for(int i=0;i<s.size();){
            int one=s.get(i);
            if(flag==0) t.add(Math.min(one,s.get(i + 1)));
            else t.add(Math.min(s.get(i),s.get(i+1)));
            flag=1-flag;i+=2;
        }
        if(t.size()==1) return t.get(0);
        else return f(t);
    }
    public int minMaxGame(int[] nums) {
        if(nums.length==1) return nums[0];
        var t=Arrays.stream(nums).boxed().collect(Collectors.toList()); //Collect into a list using Stream.collect( Collectors.toList() )
        return f(t);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中实现五子棋的极大极小算法,可以采用博弈树搜索的方式来进行。下面是一个简单的实现示例: ```java public class Gomoku { private static final int SIZE = 15; // 棋盘大小 private static final int EMPTY = 0; // 空位置 private static final int BLACK = 1; // 黑棋 private static final int WHITE = 2; // 白棋 private int[][] board; // 棋盘 public Gomoku() { board = new int[SIZE][SIZE]; } // 极大极小值算法 public int[] minimax(int depth, int player) { int[] result = new int[3]; // 结果数组,包含最佳位置和对应的分数 result[2] = (player == BLACK) ? Integer.MIN_VALUE : Integer.MAX_VALUE; if (depth == 0 || isGameOver()) { result[2] = evaluate(); return result; } List<int[]> moves = generateMoves(); for (int[] move : moves) { int row = move[0]; int col = move[1]; board[row][col] = player; if (player == BLACK) { int[] currentResult = minimax(depth - 1, WHITE); if (currentResult[2] > result[2]) { result[0] = row; result[1] = col; result[2] = currentResult[2]; } } else { int[] currentResult = minimax(depth - 1, BLACK); if (currentResult[2] < result[2]) { result[0] = row; result[1] = col; result[2] = currentResult[2]; } } board[row][col] = EMPTY; // 撤销当前落子 } return result; } // 生成所有可能的落子位置 private List<int[]> generateMoves() { List<int[]> moves = new ArrayList<>(); for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { if (board[i][j] == EMPTY) { moves.add(new int[]{i, j}); } } } return moves; } // 评估当前局面得分 private int evaluate() { // 实现自己的评估函数,根据棋盘状态给出一个分数 return 0; } // 判断游戏是否结束 private boolean isGameOver() { // 实现自己的游戏结束判断逻辑 return false; } } ``` 以上是一个简单的极大极小值算法实现的五子棋示例,其中`minimax`方法使用递归实现了极大极小值搜索,`generateMoves`方法生成所有可能的落子位置,`evaluate`方法评估当前局面得分,`isGameOver`方法判断游戏是否结束。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值