首页 > 代码库 > DFS+枚举

DFS+枚举

poj 1753 Flip Game

题目的大概意思是每一次翻动一个格子,他周围的也会跟着进行翻动,看翻动几次可以使所有的格子都变成一种颜色。

 

4*4的一共16个格子,如果16个格子都被翻转了还是没有达到要求则不可能达成

用DFS深搜来枚举,每次翻动一个格子判断一次是否达成,若满足未达成并且翻转次数没有达到本次要求翻转次数则继续否则就回到上一步翻转另外的格子

 

核心代码:

 

findTime(int i,int j,int deep)
{
     if(deep==step)
        if(isFinished) flag=1
     return;

     if(flag||i==5)
     return

    fan(i,j)
    if(j<5) findTime(i,j+1,deep+1)
    else  findTime(i+1,1,deep+1)
    fan(i,j)
    if(j<5) findTime(i,j+1,deep+1)
    else  findTime(i+1,1,deep+1)
    return;    
}






for(step=0;step<=16;step++)
{
     findTime(1,1,0);
     if(flag) break;
}

 

 

总体代码:

 

#include <iostream>
#include <cstdio>

using namespace std;

char a[5][5];
bool is[5][5]={false};
int times=0;
int step;
bool flag;

bool isfinished()
{
    char x=a[1][1];
    for(int i=1;i<=4;i++)
    {
        for(int j=1;j<=4;j++)
        {
            if(x!=a[i][j])
                return false;
        }
    }
    return true;
}

char change(int i,int j)
{
    if(a[i][j]==b) return w;
    if(a[i][j]==w) return b;
}


char fan(int i,int j)
{
     a[i][j]=change(i,j);
     if(i-1>=1) a[i-1][j]=change(i-1,j);
     if(j-1>=1) a[i][j-1]=change(i,j-1);
     if(i+1<=4) a[i+1][j]=change(i+1,j);
     if(j+1<=4) a[i][j+1]=change(i,j+1);
}
void findTimes(int i,int j,int deep)
{
    if(step==deep)
    {
        flag=isfinished();
        printf("%d %d %d\n",step,deep,flag);
        return;
    }
    if(flag||i==5)
        return;

    fan(i,j);
    if(j<4)
        findTimes(i,j+1,deep+1);
    else
        findTimes(i+1,1,deep+1);
    fan(i,j);
    if(j<4)
        findTimes(i,j+1,deep);
    else
        findTimes(i+1,1,deep);
    return;

}

int main()
{
    freopen("a.txt","rw",stdin);
    char temp;
    for(int i=1;i<=4;i++)
    {
        for(int j=1;j<=4;j++)
        {
            cin>>a[i][j];
        }
    }
    for(step=0;step<=16;step++)
    {
        findTimes(1,1,0);
        if(flag)break;
    }
    if(flag==true) printf("%d",step);
    else printf("Impossible");

    return 0;
}

 

DFS+枚举