DFS+枚举

Posted Mel年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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+枚举的主要内容,如果未能解决你的问题,请参考以下文章

ACwing92 递归实现指数型枚举 dfs

CodeForces 550B Preparing Olympiad(DFS回溯+暴力枚举)

小白也能看懂的 DFS 算法本质详解

小白也能看懂的 DFS 算法本质详解

小白也能看懂的 DFS 算法本质详解

DFS算法的本质