华为OD机试:黑白棋合法移动算法实现与优化
1. 项目背景与问题定义黑白棋又称翻转棋是一种经典的策略性棋盘游戏在华为OD机试中常作为考察编程能力的题目出现。这类题目通常要求考生在N×N的棋盘上模拟棋子移动规则并计算特定条件下的合法移动范围。这个问题的核心在于理解黑白棋的基本规则棋盘由8×8或N×N的方格组成双方轮流落子每次落子必须能够翻转对手的棋子合法移动必须至少翻转对手的一枚棋子游戏结束时以棋盘上棋子数量多少判定胜负在编程实现层面我们需要解决以下几个关键点棋盘状态的表示与存储合法移动位置的判断算法棋子翻转的逻辑实现移动范围的计算与输出2. 核心算法设计与实现2.1 棋盘表示方法在代码实现中我们通常使用二维数组来表示棋盘状态。以Python为例# 初始化N×N棋盘 def init_board(size8): board [[None for _ in range(size)] for _ in range(size)] mid size // 2 board[mid-1][mid-1] W board[mid][mid] W board[mid-1][mid] B board[mid][mid-1] B return board这种表示方法的优势在于直观对应棋盘物理结构便于通过坐标直接访问特定位置方便进行边界检查2.2 合法移动判断算法判断一个位置是否为合法落子点是本问题的核心。算法需要检查8个方向上、下、左、右、四个对角线是否存在可翻转的对手棋子def is_valid_move(board, x, y, player): if board[x][y] is not None: return False opponent B if player W else W directions [(-1,-1), (-1,0), (-1,1), (0,-1), (0,1), (1,-1), (1,0), (1,1)] for dx, dy in directions: tx, ty x dx, y dy if 0 tx len(board) and 0 ty len(board) and board[tx][ty] opponent: tx dx ty dy while 0 tx len(board) and 0 ty len(board): if board[tx][ty] is None: break if board[tx][ty] player: return True tx dx ty dy return False2.3 棋子翻转逻辑实现当确认一个位置是合法落子点后需要实际执行棋子翻转操作def make_move(board, x, y, player): if not is_valid_move(board, x, y, player): return False board[x][y] player opponent B if player W else W directions [(-1,-1), (-1,0), (-1,1), (0,-1), (0,1), (1,-1), (1,0), (1,1)] for dx, dy in directions: tx, ty x dx, y dy to_flip [] while 0 tx len(board) and 0 ty len(board) and board[tx][ty] opponent: to_flip.append((tx, ty)) tx dx ty dy if 0 tx len(board) and 0 ty len(board) and board[tx][ty] player: for fx, fy in to_flip: board[fx][fy] player break return True3. 移动范围计算与输出3.1 计算所有合法移动位置为了满足题目要求我们需要计算当前玩家所有可能的合法移动位置def get_valid_moves(board, player): valid_moves [] for i in range(len(board)): for j in range(len(board)): if is_valid_move(board, i, j, player): valid_moves.append((i, j)) return valid_moves3.2 输出移动范围根据华为OD机试的常见要求输出格式通常需要特定处理def print_valid_moves(board, player): valid_moves get_valid_moves(board, player) if not valid_moves: print(No legal moves.) return # 创建标记棋盘 marker_board [[0 for _ in range(len(board))] for _ in range(len(board))] for x, y in valid_moves: marker_board[x][y] 1 # 按要求格式输出 for row in marker_board: print( .join(map(str, row)))4. 完整解决方案实现4.1 Python实现class Reversi: def __init__(self, size8): self.size size self.board self.init_board(size) def init_board(self, size): board [[None for _ in range(size)] for _ in range(size)] mid size // 2 board[mid-1][mid-1] W board[mid][mid] W board[mid-1][mid] B board[mid][mid-1] B return board def is_valid_move(self, x, y, player): if self.board[x][y] is not None: return False opponent B if player W else W directions [(-1,-1), (-1,0), (-1,1), (0,-1), (0,1), (1,-1), (1,0), (1,1)] for dx, dy in directions: tx, ty x dx, y dy if 0 tx self.size and 0 ty self.size and self.board[tx][ty] opponent: tx dx ty dy while 0 tx self.size and 0 ty self.size: if self.board[tx][ty] is None: break if self.board[tx][ty] player: return True tx dx ty dy return False def get_valid_moves(self, player): valid_moves [] for i in range(self.size): for j in range(self.size): if self.is_valid_move(i, j, player): valid_moves.append((i, j)) return valid_moves def print_valid_moves(self, player): valid_moves self.get_valid_moves(player) if not valid_moves: print(No legal moves.) return marker_board [[0 for _ in range(self.size)] for _ in range(self.size)] for x, y in valid_moves: marker_board[x][y] 1 for row in marker_board: print( .join(map(str, row))) # 使用示例 if __name__ __main__: game Reversi(8) game.print_valid_moves(B)4.2 JavaScript实现class Reversi { constructor(size 8) { this.size size; this.board this.initBoard(size); } initBoard(size) { const board Array(size).fill().map(() Array(size).fill(null)); const mid Math.floor(size / 2); board[mid-1][mid-1] W; board[mid][mid] W; board[mid-1][mid] B; board[mid][mid-1] B; return board; } isValidMove(x, y, player) { if (this.board[x][y] ! null) { return false; } const opponent player B ? W : B; const directions [ [-1,-1], [-1,0], [-1,1], [0,-1], [0,1], [1,-1], [1,0], [1,1] ]; for (const [dx, dy] of directions) { let tx x dx; let ty y dy; if (tx 0 tx this.size ty 0 ty this.size this.board[tx][ty] opponent) { tx dx; ty dy; while (tx 0 tx this.size ty 0 ty this.size) { if (this.board[tx][ty] null) { break; } if (this.board[tx][ty] player) { return true; } tx dx; ty dy; } } } return false; } getValidMoves(player) { const validMoves []; for (let i 0; i this.size; i) { for (let j 0; j this.size; j) { if (this.isValidMove(i, j, player)) { validMoves.push([i, j]); } } } return validMoves; } printValidMoves(player) { const validMoves this.getValidMoves(player); if (validMoves.length 0) { console.log(No legal moves.); return; } const markerBoard Array(this.size).fill().map(() Array(this.size).fill(0)); for (const [x, y] of validMoves) { markerBoard[x][y] 1; } for (const row of markerBoard) { console.log(row.join( )); } } } // 使用示例 const game new Reversi(8); game.printValidMoves(B);5. 算法优化与性能考虑5.1 时间复杂度分析基础实现的时间复杂度判断单个位置是否合法O(N)最坏情况下需要检查8个方向每个方向最多N步获取所有合法移动O(N³)N²个位置每个位置O(N)检查5.2 优化思路方向检查提前终止一旦在某个方向找到合法条件即可终止该方向的检查缓存合法移动在游戏状态未改变时缓存计算结果位运算优化对于固定大小的棋盘如8×8可以使用位运算加速5.3 优化后的合法移动判断def is_valid_move_optimized(board, x, y, player): if board[x][y] is not None: return False opponent B if player W else W size len(board) directions [(-1,-1), (-1,0), (-1,1), (0,-1), (0,1), (1,-1), (1,0), (1,1)] for dx, dy in directions: tx, ty x dx, y dy found_opponent False while 0 tx size and 0 ty size: if board[tx][ty] is None: break if board[tx][ty] player: if found_opponent: return True break if board[tx][ty] opponent: found_opponent True tx dx ty dy return False6. 测试用例设计与验证6.1 单元测试设计良好的测试用例应覆盖以下场景初始棋盘的合法移动边缘位置的移动无合法移动的情况多个方向可翻转的情况非法移动尝试6.2 Python测试示例import unittest class TestReversi(unittest.TestCase): def setUp(self): self.game Reversi(8) def test_initial_valid_moves_black(self): valid_moves self.game.get_valid_moves(B) expected [(2,3), (3,2), (4,5), (5,4)] self.assertEqual(set(valid_moves), set(expected)) def test_invalid_move(self): self.assertFalse(self.game.is_valid_move(0, 0, B)) def test_no_valid_moves(self): # 创建一个无合法移动的场景 custom_board [[None]*8 for _ in range(8)] custom_board[3][3] B self.game.board custom_board self.assertEqual(self.game.get_valid_moves(W), []) if __name__ __main__: unittest.main()6.3 边界情况处理棋盘边界确保算法正确处理棋盘边缘位置最小棋盘处理2×2等小棋盘的极端情况全满棋盘当棋盘被完全填满时的处理交替玩家确保交替落子时逻辑正确7. 华为OD机试注意事项7.1 输入输出格式华为OD机试通常有严格的输入输出要求需要注意输入可能是字符串形式需要正确解析输出格式必须完全匹配题目要求注意处理行尾空格等细节问题7.2 性能限制机试题目通常有执行时间和内存限制Python避免使用深层递归JavaScript注意V8引擎的优化限制对于大N情况如N100需要优化算法7.3 常见错误棋盘索引越界未正确处理初始棋局方向检查遗漏某些情况输出格式不符合要求未处理无合法移动的特殊情况8. 扩展与变种问题8.1 变种问题示例限制移动方向只允许水平或垂直移动不同棋盘大小处理非对称棋盘多玩家版本三人或四人黑白棋移动代价不同位置落子有不同的代价8.2 高级算法方向Minimax算法实现AI对战蒙特卡洛树搜索优化AI决策Zobrist哈希快速判断棋盘状态重复并行计算使用多线程加速搜索在实际开发中黑白棋算法可以进一步优化为更高效的实现特别是在需要处理大型棋盘或实现AI对战的情况下。对于华为OD机试而言掌握基础实现并确保正确性是最关键的要求。

相关新闻

深度解析QCA8334-AL3C:高通4端口工业级千兆二层交换芯片架构与应用

深度解析QCA8334-AL3C:高通4端口工业级千兆二层交换芯片架构与应用

QCA8334-AL3C:高通4端口二层千兆以太网交换芯片深度解析 在工业交换机、企业级网关以及物联网边缘设备等网络硬件设计中,以太网交换芯片的选择直接决定了整机的端口密度、转发性能以及长期可靠性。传统的软件桥接方案在带宽和延迟方面存在明显瓶颈&…

2026/8/21 4:53:47 阅读更多 →
深度解析88E6390-A0-TLA2I000:Marvell 11端口工业级TSN千兆交换芯片架构与应用

深度解析88E6390-A0-TLA2I000:Marvell 11端口工业级TSN千兆交换芯片架构与应用

88E6390-A0-TLA2I000:Marvell工业级11端口千兆以太网交换芯片深度解析在企业级接入交换机、工业以太网设备以及需要确定性通信的嵌入式网络系统中,以太网交换芯片的选型直接决定了网络的带宽、时延和长期可靠性。传统消费级交换芯片在宽温支持和时间敏感…

2026/8/21 4:53:47 阅读更多 →
基于LLM多智能体的遗留代码现代化迁移:从PL/SQL到Java的实战解析

基于LLM多智能体的遗留代码现代化迁移:从PL/SQL到Java的实战解析

1. 从“屎山”到“新大陆”:为什么我们需要智能的遗留代码翻译最近在跟一个做金融系统的朋友聊天,他愁眉苦脸地跟我抱怨,说他们核心系统里还有一大堆十几年前写的PL/SQL存储过程,逻辑复杂得像一团乱麻,没人敢动。想迁移…

2026/8/21 4:53:47 阅读更多 →

最新新闻

手机存储扩容新思路|四款主流云盘工具功能实测与对比

手机存储扩容新思路|四款主流云盘工具功能实测与对比

一、前言当下手机高清影像、原创素材、办公文档与社交缓存数据持续增长,设备自带的本地存储空间很容易出现容量不足的情况,影响日常存储与使用体验。更换大容量设备、硬件拆机扩容存在成本高、硬件改动风险大的问题,云端软件扩容凭借无需改动…

2026/8/21 9:01:48 阅读更多 →
AI视频生成技术拆解:Seedance类模型在企业内容生产中的工程化实践

AI视频生成技术拆解:Seedance类模型在企业内容生产中的工程化实践

作为长期做AIGC应用落地的工程师,这一年被业务方问得最多的问题是:"AI视频生成能不能接进我们的内容生产流程?"答案是能,但坑不少。这篇文章从工程视角拆解Seedance类视频生成模型在企业场景下的落地实践。 一、Seedanc…

2026/8/21 9:01:48 阅读更多 →
国内外标准文献免费查询及下载攻略——国标 行标 团体标,国际标准 国外标准,全搞定,建议收藏

国内外标准文献免费查询及下载攻略——国标 行标 团体标,国际标准 国外标准,全搞定,建议收藏

文章目录前言一、国内官方免费标准平台1. 国家标准信息公共服务平台2. 全国标准信息公共服务平台3. 分行业专属免费标准网站二、国际 / 国外标准官方渠道1. ISO 国际标准化组织官网2. IEC 国际电工委员会3. 欧美常用行业标准官网三、第三方网站1. 国内常用的第三方网站2. 国外的…

2026/8/21 9:01:48 阅读更多 →
线性规划实战:从模型构建到求解分析,掌握数学建模核心优化方法

线性规划实战:从模型构建到求解分析,掌握数学建模核心优化方法

1. 从“拍脑袋”到“算出来”:线性规划在数学建模中的核心价值如果你参加过数学建模比赛,或者在工作中处理过资源分配、生产计划这类问题,大概率听过“线性规划”这个词。很多人的第一印象是:一堆数学公式,看着就头疼。…

2026/8/21 9:01:48 阅读更多 →
2026求职趋势:微证书化与人机协同面试解析

2026求职趋势:微证书化与人机协同面试解析

1. 求职市场变局:从"金三银四"到"全年备战" 2026年的求职市场早已不是我们熟悉的模样。记得五年前,每到春节后,"金三银四"的招聘旺季总会如期而至,求职者们摩拳擦掌准备简历,HR们忙着筛…

2026/8/21 9:01:48 阅读更多 →
PFTrack 2017 Windows版下载与详细安装指南(含图文步骤+实操视频教程)

PFTrack 2017 Windows版下载与详细安装指南(含图文步骤+实操视频教程)

温馨提示:文末有联系方式 PFTrack 2017 Windows专业版全面介绍 PFTrack 2017是业界公认的高精度三维摄像机反求与动态物体跟踪解决方案,专为影视后期、VFX特效合成及动态匹配需求深度优化,支持Windows平台稳定运行。 一键直达:高…

2026/8/21 9:00:48 阅读更多 →

日新闻

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

前言随着国家数字基础设施信创替代、关键技术自主可控战略持续深化,口岸智慧安防、边检智能管控领域正全面进入国产化、自主化、安全可控升级周期。当前国内机场边检旅客识别与定位体系长期依赖国外商用视觉算法、进口成像硬件、闭源通用计算平台,存在核…

2026/8/21 0:00:42 阅读更多 →
别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱当下数字化建设浪潮中,很多项目将三维可视化、视频贴图叠加的数字孪生等同于空间智能。传统数字孪生更多停留在三维场景复刻,擅长把物理世界“画出来、展示出来”,…

2026/8/21 0:00:42 阅读更多 →
105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40C到85C的影像质量一致性——ISP参数温漂补偿与产线标定策略 去年冬天在北方某车厂做A样评审,凌晨四点的黑河试验场,零下三十三度。客户拿了一台冷启动的车,中控屏上倒车影像全是雪花噪点,暗部细节直接糊成一片。我第一反应是sensor温度没上来,暗电流…

2026/8/21 0:00:42 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 0:02:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/20 6:11:08 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/20 21:46:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/21 0:14:22 阅读更多 →