HDU 2209 翻纸牌游戏(DFS)

翻纸牌游戏

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2557    Accepted Submission(s): 918


Problem Description
有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌。但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者有反翻到正)时,他左右两张纸牌(最左边和最右边的纸牌,只会影响附近一张)也必须跟着翻动,现在给你一个乱的状态,问你能否把他们整理好,使得每张纸牌都正面朝上,如果可以,最少需要多少次操作。
 

 

Input
有多个case,每个case输入一行01符号串(长度不超过20),1表示反面朝上,0表示正面朝上。
 

 

Output
对于每组case,如果可以翻,输出最少需要翻动的次数,否则输出NO。
 

 

Sample Input
01 011
 

 

Sample Output
NO 1
 

 

Author
wangye
 

 

Recommend
wangye

 

分两种情况:

1、第一张牌翻动

2、第一张牌不翻动

分别进行搜索,最后结束时判断下是否所有的牌都正面朝上了。

#include<iostream>

#include<cstdio>

#include<cstring>

#include<cmath>

#include<stdlib.h>

#include<queue>

#include<stack>

#include<algorithm>

#define LL __int64

using namespace std;

const int MAXN=20+5;

const int INF=0x3f3f3f3f;

const double EPS=1e-9;

int dir4[][2]={{0,1},{1,0},{0,-1},{-1,0}};

int dir8[][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};

int dir_8[][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};

char map[MAXN];

int MAP[MAXN],len,ans;



bool judge()

{

    int sum=0;

    for(int i=0;i<len;i++)

        sum+=MAP[i];

    if(sum==0) return true;

    else return false;

}

int DFS(int cur,int step,int len)

{

    if(cur==len)

    {

        if(judge())

            return step;

        else

            return INF;

    }



    if(MAP[cur-1])

    {

        MAP[cur-1]=!MAP[cur-1];

        MAP[cur]=!MAP[cur];

        MAP[cur+1]=!MAP[cur+1];

        step++;

    }

    DFS(cur+1,step,len);



}

int main()

{

    while(scanf("%s",map)!=EOF)

    {

        ans=INF;

        len=strlen(map);

        memset(MAP,0,sizeof(MAP));

        for(int i=0;i<len;i++)

            MAP[i]=map[i]-'0';



        MAP[0]=!MAP[0];

        MAP[1]=!MAP[1];

        ans=min(ans,DFS(1,1,len));



        for(int i=0;i<len;i++)

            MAP[i]=map[i]-'0';

        ans=min(ans,DFS(1,0,len));



        if(ans==INF)

            cout<<"NO"<<endl;

        else

            cout<<ans<<endl;

    }

    return 0;

}
View Code

 

你可能感兴趣的:(HDU)