五子棋迷【数组】

张兵和王武是五子棋迷,工作之余经常切磋棋艺。这不,这会儿又下起来了。走了一
会儿,轮张兵了,对着一条线思考起来了,这条线上的棋子分布如下 :
用数组表示 : -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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值