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
原文地址:https://www.cnblogs.com/clliff/p/4240732.html