码迷,mamicode.com
首页 > 其他好文 > 详细

HDOj-2209-翻纸牌游戏-DFS

时间:2015-04-01 20:07:23      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:dfs

翻纸牌游戏

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


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

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

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

Sample Input
01 011
 

Sample Output
NO 1
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
const int INF=20<<1;
const int MAX=20+10;
char str[MAX];
int a[MAX];
int DFS(int i,int len,int num)
{
	if(i==len) return a[i-1] ? INF:num;
	if(a[i-1])
	{
		a[i-1]=0;
		a[i]=!a[i];
		a[i+1]=!a[i+1];
		num++;
	}
	return DFS(i+1,len,num);
}
int main()
{
	while(~scanf("%s",str))
	{
		int len=strlen(str);
		for(int i=0;i<len;i++)
		{
			a[i]=str[i]-'0';
		}
	//第一位为 
		int sum=INF;
		a[0]=!a[0];
		a[1]=!a[1];
		sum=min(sum,DFS(1,len,1));  // 翻转第一位 
		for(int i=0;i<len;i++)
		{
			a[i]=str[i]-'0';
		}
		sum=min(sum,DFS(1,len,0));  //不翻转第一位 
		if(sum==INF) cout<<"NO\n";
		else         cout<<sum<<endl; 
	}
	return 0;
}


HDOj-2209-翻纸牌游戏-DFS

标签:dfs

原文地址:http://blog.csdn.net/holyang_1013197377/article/details/44810339

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!