zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Linux下运行java项目
    Matlab 绘图完整入门
    Matlab命令合集 妈妈再也不用担心我不会用matlab了
    详尽全面的matlab绘图教程
    拉格朗日乘子法 那些年学过的高数
    【转】几款网络仿真软件的比较
    正则表达式30分钟入门教程 ——堪称网上能找到的最好的正则式入门教程
    并发编程详细整理
    高并发通信模型NIO
    Java并发编程的艺术笔记(九)——FutureTask详解
  • 原文地址:https://www.cnblogs.com/clliff/p/4240732.html
Copyright © 2011-2022 走看看