终于来填坑了。依旧是递归的题目,最近做的都是关于递归的问题。下一个是汉诺塔问题。
这道题也是看了很多别人的博客才弄出来的,但是分析还是要试着自己写一下。
题意是这样的,有一个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;