首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >五子棋迷

五子棋迷

原创
作者头像
代码小李
发布2025-01-27 20:02:27
发布2025-01-27 20:02:27
1830
举报

题目描述

张兵和王武是五子棋迷,工作之余经常切磋棋艺。这不,这会儿又下起来了。走了一会儿,轮张兵了,对着一条线思考起来了,这条线上的棋子分布如下

用数组表示:-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个整数,表示出子位置的数组下标

为了实现这个任务,我们需要编写一个 C++ 程序来找到最有利的出子位置。根据题目描述,我们可以按照以下步骤来解决这个问题:

  1. 读取输入:获取当前出子颜色和棋局状态。
  2. 遍历棋局:找到所有空位,并检查在这些空位上放置当前颜色的棋子后,是否可以增加最大连续长度。
  3. 选择最优位置:如果存在多个符合要求的位置,选择最靠近中间的较小的那个坐标。
  4. 返回结果:如果没有可行位置,返回 -1。

下面是具体的实现代码:

代码语言:cpp
复制
#include <iostream>
#include <vector>
#include <algorithm>

int findBestMove(int color, const std::vector<int>& board) {
    int n = board.size();
    int mid = n / 2;
    int best_pos = -1;
    int max_length = 0;

    for (int i = 0; i < n; ++i) {
        if (board[i] == 0) {  // 找到空位
            int left = i - 1;
            int right = i + 1;
            int current_length = 1;  // 放置当前颜色的棋子

            // 向左检查
            while (left >= 0 && board[left] == color) {
                current_length++;
                left--;
            }

            // 向右检查
            while (right < n && board[right] == color) {
                current_length++;
                right++;
            }

            // 检查是否超过5个
            if (current_length <= 5 && current_length > max_length) {
                max_length = current_length;
                best_pos = i;
            } else if (current_length == max_length) {
                // 如果有多个相同长度的位置,选择最靠近中间的较小的那个坐标
                if (std::abs(i - mid) < std::abs(best_pos - mid) || (std::abs(i - mid) == std::abs(best_pos - mid) && i < best_pos)) {
                    best_pos = i;
                }
            }
        }
    }

    return best_pos;
}

int main() {
    int color;
    std::cin >> color;

    int n;
    std::cin >> n;
    std::vector<int> board(n);
    for (int i = 0; i < n; ++i) {
        std::cin >> board[i];
    }

    int best_pos = findBestMove(color, board);
    std::cout << best_pos << std::endl;

    return 0;
}

解释

  1. 读取输入:从标准输入中读取当前出子颜色和棋局状态。
  2. 遍历棋局:遍历棋局数组,找到所有空位(值为 0)。
  3. 检查连续长度:对于每个空位,检查在其位置放置当前颜色的棋子后,是否可以增加最大连续长度。同时确保连续长度不超过 5。
  4. 选择最优位置:如果存在多个符合要求的位置,选择最靠近中间的较小的那个坐标。
  5. 返回结果:如果没有可行位置,返回 -1。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 输入描述
  • 输出描述
    • 解释
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档