POJ 1753 翻棋子 (dfs+递归)。

这是一个关于递归和深度优先搜索(DFS)的编程问题。博客介绍了如何解决一个4x4棋盘翻棋子达到颜色统一的最小翻转次数问题。博主通过五个函数实现解决方案,包括棋盘构建、颜色统一检测、翻转操作、边缘检测和DFS。在DFS函数中,博主设定了递归出口,并在棋盘无解或颜色统一时更新翻转次数。最后,根据最大翻转次数判断棋盘是否可解并输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

终于来填坑了。依旧是递归的题目,最近做的都是关于递归的问题。下一个是汉诺塔问题。
这道题也是看了很多别人的博客才弄出来的,但是分析还是要试着自己写一下。
题意是这样的,有一个4*4的棋盘,你可以自定义输入黑白两色棋子,直到填满着整个棋盘。然后就开始翻棋,翻棋的时候,翻转当前的某个棋子的同时,它附近的上下左右4个棋子也要翻转,当然,如果翻的是边上的棋子,那就翻它附近的棋子就行了。这道题是问最少翻多少次才能使所有棋子颜色统一,输出次数。

原题给了一个例子,例如输入的棋盘是这样的:
bwwb
bbwb
bwwb
bwww
那就要输出该棋盘的最少翻转次数:4

一共定义了5个函数,分别是:1.让用户输入棋子使棋盘建立的函数:buile_chessboard;2.检测是否已经达到棋盘颜色统一的函数:finish;3.执行翻棋操作的函数:turn;4.检测棋子是否在边缘,辅助翻棋的函数:flip;5.dfs函数;

前4个函数都不难理解,实现起来也容易,头疼的是dfs。

void dfs (int now_place,int num_turn)//now_place代表当前的方格,num_turn代表翻转的方格数
{
    if(finish()){
        if(max>num_turn)
            max = num_turn;//改变max的值,使其等于当前翻转的棋子
        return;
    }
    if(now_place>=16)
        return;
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值