求Haskell实现Connect4棋盘指定列最高空行的函数方案
解决Connect4游戏中获取指定列最高空行的问题
首先明确需求:给定Connect4棋盘([[Char]],'B'代表空位置,'X'/'O'代表已填充),实现函数返回指定列中未被填充的最高行号(从上往下1-based计数),比如传入列4时返回3(对应示例棋盘中的第3行)。
你的尝试问题分析
你之前的getlist函数逻辑存在偏差:
- 第一个版本仅过滤每行中等于指定字符的元素,完全没有针对指定列做提取操作;
- 第二个版本的嵌套列表推导式逻辑混乱,错误地将行索引与行元素绑定,同时重复遍历棋盘行,根本没实现列元素的提取。
正确实现思路与代码
核心步骤:
- 将1-based的列号转换为Haskell默认的0-based索引;
- 提取指定列的所有元素(从上到下的顺序);
- 找到列中第一个非
'B'的元素位置,其前一行就是最高空行; - 若列全为空,则返回最后一行的行号。
代码实现(需要导入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
相关产品推荐
相关产品推荐

