Filp_game

本文介绍了一个使用深度优先搜索(DFS)算法解决翻转棋盘问题的实例。通过对棋盘状态进行递归搜索,实现了找到最少翻转次数使所有棋子颜色统一的目标。文章特别强调了在实现过程中遇到的全局变量初始化问题。

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

dfs算法求解,注意全局变量的初始化问题,被坑了一下午。。。

#include <iostream>
using namespace std;
#define size 4
char input[4][4];
int  data[4][4];
int DX[4]={-1,0,1,0};
int DY[4]={0,1,0,-1};
typedef struct{
    int x;
    int y;
}pos;
pos cur_pos,tmp_pos;
int min_step=10000;
//判断是否全是白色的棋子
bool justice_all_0(){
    bool ret = true;
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            if(data[i][j]==1){
                ret = false;
                //return ret;
            }
        }
    }
    return ret;
}
//判断是否全是黑色的棋子
bool justice_all_1(){
   bool ret = true;
   for(int i=0;i<4;i++){
       for(int j=0;j<4;j++){
            if(data[i][j]==0){
                ret = false;
                //return ret;
            }
        }
    }
    return ret;
}
//dfs
void dfs(int step, int count){
    //printf("%d %d\n", step, count);
   if(step>=16){return;}//每一个都翻过了也不行


   //if(step==0&&(justice_all_1()||justice_all_0())){ printf("0");return;}
   if(justice_all_1()||justice_all_0()){
       //printf("find one!\n");
        if(count<min_step){
            min_step = count;
        }
    }
       pos cur_pos;
       cur_pos.x = step/4;//就是按照顺序走的,准确可行
       cur_pos.y = step%4;
       
       //不翻转
       dfs(step+1,count);
       cur_pos.x = step/4;//就是按照顺序走的,准确可行
       cur_pos.y = step%4;

        //翻转
       data[cur_pos.x][cur_pos.y] = !data[cur_pos.x][cur_pos.y];
       for(int j=0;j<4;j++){
            tmp_pos.x = cur_pos.x + DX[j];
            tmp_pos.y = cur_pos.y + DY[j];
            if(tmp_pos.x>=0&&tmp_pos.y>=0&&tmp_pos.x<size&&tmp_pos.y<size){
                data[tmp_pos.x][tmp_pos.y] = !data[tmp_pos.x][tmp_pos.y];
            }
       }
       dfs(step+1,count+1);
       //需要回溯
       data[cur_pos.x][cur_pos.y] = !data[cur_pos.x][cur_pos.y];
       for(int k=0;k<4;k++){
            tmp_pos.x = cur_pos.x + DX[k];
            tmp_pos.y = cur_pos.y + DY[k];
            if(tmp_pos.x>=0&&tmp_pos.y>=0&&tmp_pos.x<size&&tmp_pos.y<size){
                data[tmp_pos.x][tmp_pos.y] = !data[tmp_pos.x][tmp_pos.y];
            }
       }


}
int main(){
    freopen("input.txt","r",stdin);
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            cin>>input[i][j];}
    }
    for(int k=0;k<4;k++){
        for(int l=0;l<4;l++){
            if(input[k][l]=='w'){
                data[k][l] = 0;
            }
            else if(input[k][l]=='b'){
                data[k][l] = 1;}
        }
    }

    dfs(0,0);
    printf("%d\n",min_step);  
    return 0;
}

  要注意的就是不翻的回溯,不翻的话也是有回溯过程的,回溯过程需要对于当前的cur_pos初始化,不然想一下如果走到了最后一步向前面回溯的时候当前点坐标还是回溯前的坐标,是会出问题的。

转载于:https://www.cnblogs.com/linux0537/p/6612783.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值