You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求Haskell实现Connect4棋盘指定列最高空行的函数方案

解决Connect4游戏中获取指定列最高空行的问题

首先明确需求:给定Connect4棋盘([[Char]],'B'代表空位置,'X'/'O'代表已填充),实现函数返回指定列中未被填充的最高行号(从上往下1-based计数),比如传入列4时返回3(对应示例棋盘中的第3行)。

你的尝试问题分析

你之前的getlist函数逻辑存在偏差:

  • 第一个版本仅过滤每行中等于指定字符的元素,完全没有针对指定列做提取操作;
  • 第二个版本的嵌套列表推导式逻辑混乱,错误地将行索引与行元素绑定,同时重复遍历棋盘行,根本没实现列元素的提取。

正确实现思路与代码

核心步骤:

  1. 将1-based的列号转换为Haskell默认的0-based索引;
  2. 提取指定列的所有元素(从上到下的顺序);
  3. 找到列中第一个非'B'的元素位置,其前一行就是最高空行;
  4. 若列全为空,则返回最后一行的行号。

代码实现(需要导入Data.List的findIndex函数):

import Data.List (findIndex)

-- 输入:棋盘([[Char]])、1-based列号;输出:1-based最高空行行号
getTopEmptyRow :: [[Char]] -> Int -> Int
getTopEmptyRow board col1Based =
  let col = col1Based - 1  -- 转换为0-based列索引
      column = map (!! col) board  -- 提取指定列的所有元素(从上到下)
      firstFilledIdx = findIndex (/= 'B') column  -- 找到第一个填充位置的0-based行索引
  in case firstFilledIdx of
       Just idx -> idx  -- 转1-based:第一个填充行的前一行是idx-1(0-based),加1后等于idx
       Nothing -> length board  -- 全列空,返回最后一行的1-based编号

测试示例

用你提供的testboard测试:

testboard :: [[Char]]
testboard = [['B','B','B','B','B','B','B'],
             ['B','B','B','B','B','B','B'],
             ['B','B','B','B','B','B','B'],
             ['B','B','B','X','X','B','B'],
             ['B','B','O','O','X','B','B'],
             ['B','O','O','X','X','X','B']]

-- 调用函数,传入列4(1-based)
main = print $ getTopEmptyRow testboard 4  -- 输出:3,符合预期

内容的提问来源于stack exchange,提问作者P47HF1ND3R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:32:55