![P10386 [蓝桥杯 2024 省 A] 五子棋对弈题解复盘](http://pic.xiahunao.cn/yaotu/P10386 [蓝桥杯 2024 省 A] 五子棋对弈题解复盘)
五子棋平局蓝桥杯填空题题解复盘基本信息项目内容题目编号、来源蓝桥杯 五子棋平局结果填空题训练层级B DFS 回溯知识版块DFS、回溯、棋盘枚举、状态压缩解题前・关键信号识别维度分析目标、约束、底层结构目标5×5 棋盘白棋先手共 13 个黑棋 12 个终局无人五子连珠求平局终局数量约束棋盘 25 格每格三种状态空/白/黑但终局无空格底层结构DFS 枚举 25 个格子的黑白状态回溯恢复棋盘剪枝限制棋子数量。数据规模25 个格子每个格子 2 种状态白/黑总终局数 C(25,13) 5,200,300DFS 枚举所有方案完全可行。候选算法和依据DFS 回溯依据每个格子只有白/黑两种终局状态按顺序逐格枚举用剪枝减少搜索量。复杂度预判时间复杂度 O(2^25)但剪枝后大幅减少空间复杂度 O(25)。解题后・外化复盘维度内容实现结构 / 核心思路第一步从 (0,0) 开始 DFS逐格处理每个格子放白棋或黑棋第二步每步检查白棋是否超过 13 个、黑棋是否超过 12 个超过则剪枝返回第三步当 25 个格子全部处理完x5检查白棋是否恰好 13 个、黑棋恰好 12 个且无人五子连珠满足则 ans第四步定义 check() 函数检查 5 行、5 列、2 条对角线是否有五个相同棋子第五步输出 ans。核心思想枚举所有终局状态筛选满足棋子数量且无人获胜的平局局面。错因回溯1. 剪枝条件放在出口后面导致白棋超过 13 个的非法状态也被计入 ans2. 出口处没有检查white 13 black 12导致棋子数量不对的终局也被计入3. check() 函数用return true表示有人赢调用时用!check()表示平局逻辑正确但容易混淆4. 忘记回溯恢复board[x][y] 0导致棋盘状态被污染。边界和易错点1. 剪枝条件 if (white 13下次看到什么信号我应该想到这个方法看到「棋盘 黑白棋子 平局 结果填空」用 DFS 枚举所有终局状态 回溯。AC 完整代码#includeiostreamusingnamespacestd;intboard[5][5];intans0;boolcheck(){for(inti0;i5;i){if(board[i][0]!0board[i][0]board[i][1]board[i][1]board[i][2]board[i][2]board[i][3]board[i][3]board[i][4]){returntrue;}if(board[0][i]!0board[0][i]board[1][i]board[1][i]board[2][i]board[2][i]board[3][i]board[3][i]board[4][i]){returntrue;}}if(board[0][0]!0board[0][0]board[1][1]board[1][1]board[2][2]board[2][2]board[3][3]board[3][3]board[4][4]){returntrue;}if(board[0][4]!0board[0][4]board[1][3]board[1][3]board[2][2]board[2][2]board[3][1]board[3][1]board[4][0]){returntrue;}returnfalse;}voiddfs(intx,inty,intwhite,intblack){if(white13||black12)return;if(x5){if(white13black12!check())ans;return;}intnxx,nyy1;if(ny5){nxx1;ny0;}board[x][y]1;dfs(nx,ny,white1,black);board[x][y]2;dfs(nx,ny,white,black1);board[x][y]0;}intmain(){dfs(0,0,0,0);coutansendl;return0;}