五子棋迷【数组】

张兵和王武是五子棋迷,工作之余经常切磋棋艺。这不,这会儿又下起来了。走了一
会儿,轮张兵了,对着一条线思考起来了,这条线上的棋子分布如下 :
用数组表示 : -1 0 1 1 1 0 1 0 1 -1
棋子分布说明 :
1. -1 代表白子, 0 代表空位, 1 代表黑子
2. 数组长度 L, 满足 1 < L < 40, L 为奇数 你得帮他写一个程序,算出最有利的出子位置。 最有利定义 :
1. 找到一个空位 (0) ,用棋子 (1/-1) 填充该位置,可以使得当前子的最大连续长度变大 ;
2. 如果存在多个位置,返回最靠近中间的较小的那个坐标 ;
3. 如果不存在可行位置,直接返回 -1;
4. 连续长度不能超过 5 ( 五字棋约束 );
输入描述:
第一行 : 当前出子颜色
第二行 : 当前的棋局状态
输出描述:
1 个整数,表示出子位置的数组下标
public class WZQ {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int color=in.nextInt();
        in.nextLine();
        String num=in.nextLine();
        String[] nums=num.split(" ");
        int[] num1=new int[nums.length];
        for (int j=0;j<nums.length;j++){
            num1[j]=Integer.parseInt(nums[j]);
        }
        int best = getBest(num1, color);
        System.out.println(best);
    }

    public static int getBest(int[] nums,int color){
        //记录可以插入的下标
        List<Integer> index=new ArrayList<>();
        for (int i=0;i<nums.length;i++){
            if (nums[i]==0){
                index.add(i);
            }
        }
        if (index.size()==0)
            return -1;
        //记录获取的最大连续值
        int max=-1;
        //最佳索引
        int bestIndex;
        List<Integer> maxs=new ArrayList<>();
        Map<Integer,Integer> keyValue=new HashMap<>();
        //获取所有可以放入的下标以及放入后对应的连续最大值,同时按照下标记录下
        for (int id : index) {
            int[] copyNums=nums.clone();
            copyNums[id]=color;
            if (getMax(copyNums, color)<=5){
                max =getMax(copyNums, color);
                keyValue.put(id,max);
                maxs.add(max);
            }
        }
        Integer[] array = maxs.toArray(new Integer[0]);
        //将录入的满足条件的下标进行排序
        Arrays.sort(array);
        List<Integer> maxIndexs=new ArrayList<>();
        //获取等于最大值的所有下标
        List<Integer> bests=new ArrayList<>();
        for(int id : index){
            if (Objects.equals(keyValue.get(id), array[array.length - 1])){
                bests.add(id);
            }
        }
        if (bests.size()==1){
            return bests.get(0);
        }
        int bestId=bests.get(0);
        int staId=nums.length/2;
        //如果存在多个相同的值,获取距离中间值最近的下标
        for (Integer best : bests) {
            if (Math.abs(best - staId) <Math.abs( bestId - staId)) {
                bestId = best;
            }
            if (Math.abs(best - staId) == Math.abs(bestId - staId)) {
                bestId = Math.min(best, bestId);
            }
        }
        return bestId;
    }

    /**
     * 获取放入棋子后最大的连续数
     */
    public static int getMax(int[] nums,int color){
        int len=0;
        int maxLen=0;
        for (int num : nums) {
            if (num == color) {
                len++;
            }
            if (num != color) {
                maxLen = Math.max(len, maxLen);
                len = 0;
            }
        }
        return maxLen;
    }
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
假设我们用一个二维数组 `board` 来存储棋盘,其中 `board[i][j]` 表示第 `i` 行第 `j` 列的位置,存储的值为: - 0:表示该位置没有棋子 - 1:表示该位置为黑子 - 2:表示该位置为白子 现在假设黑方获胜,我们可以遍历整个棋盘,找到所有符合胜利条件的棋子,然后输出它们的坐标。 具体实现代码如下: ```java // 判断是否存在连续的五个棋子 public boolean checkWin(int[][] board, int x, int y, int color) { // 水平方向 int count = 0; for (int j = y; j < y + 5; j++) { if (j >= board[0].length || board[x][j] != color) { break; } count++; } if (count == 5) { return true; } // 垂直方向 count = 0; for (int i = x; i < x + 5; i++) { if (i >= board.length || board[i][y] != color) { break; } count++; } if (count == 5) { return true; } // 左上到右下对角线方向 count = 0; for (int i = x, j = y; i < x + 5 && j < y + 5; i++, j++) { if (i >= board.length || j >= board[0].length || board[i][j] != color) { break; } count++; } if (count == 5) { return true; } // 右上到左下对角线方向 count = 0; for (int i = x, j = y; i < x + 5 && j >= y - 4; i++, j--) { if (i >= board.length || j < 0 || board[i][j] != color) { break; } count++; } if (count == 5) { return true; } return false; // 没有获胜 } // 输出所有胜利的棋子的坐标 public void printWinningPieces(int[][] board) { for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[0].length; j++) { if (board[i][j] == 1 && checkWin(board, i, j, 1)) { System.out.println("黑方胜利,坐标为:" + i + "," + j); } else if (board[i][j] == 2 && checkWin(board, i, j, 2)) { System.out.println("白方胜利,坐标为:" + i + "," + j); } } } } ``` 这段代码中,`checkWin` 方法用于判断某个位置是否存在连续的五个棋子,`printWinningPieces` 方法则用于遍历整个棋盘,找到所有符合胜利条件的棋子,并输出它们的坐标。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值