码迷,mamicode.com
首页 > 其他好文 > 详细

Filp_game

时间:2017-03-24 19:15:12      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:define   ios   oid   注意   ==   nbsp   bsp   i++   false   

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初始化,不然想一下如果走到了最后一步向前面回溯的时候当前点坐标还是回溯前的坐标,是会出问题的。

Filp_game

标签:define   ios   oid   注意   ==   nbsp   bsp   i++   false   

原文地址:http://www.cnblogs.com/linux0537/p/6612783.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!