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

dfs(vijos113424点游戏)

时间:2017-06-04 10:53:16      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:number   lan   使用   标记   blog   扑克   游戏   运算   pre   

几十年前全世界就流行一种数字扑克游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为“算24点”。您作为游戏者将得到4个1-13(在扑克牌里用A代替1,J代替11,Q代替12,K代替13)之间的自然数作为操作数,而您的任务是对这4个操作数进行适当的算术运算,判断运算结果是否等于24。能输出1,不能输出0。您可以使用的运算只有:**+,-,*,/**,您还可以使用**(,)**来改变运算顺序。注意:**所有的中间结果须是整数**,所以一些除法运算是不允许的(例如,**(2*2)/4**是合法的,**2*(2/4)**是不合法的)。下面我们给出一个游戏的具体例子:若给出的4个操作数是:1、2、3、7,则一种可能的解答是**1+2+3*7=24**。

样例输入1

3 8 10 Q

样例输出1

1

思路就是裸的深搜,找过得点标记一下~

#include<bits/stdc++.h>
using namespace std;

bool book[5];
double w[5];
int ok=0;

int flag=0;
void dfs(double sum,int n)
{
	if(flag) return ;
	
	if(n==4&&(sum-24)*(sum-24)<=1e-5)
	{
		ok=1;flag=1;
	}
	for(int i=1;i<=4;i++)
	{
		if(!book[i])
		{
			book[i]=1;
			dfs(sum+w[i],n+1);
			dfs(sum-w[i],n+1);
			dfs(sum*w[i],n+1);
			dfs(w[i]-sum,n+1);
			if(w[i]!=0) dfs(sum/w[i],n+1);
			if(sum!=0) dfs(w[i]/sum,n+1);
			book[i]=0;
		}
	}
}

int main()
{
	string s;
	for(int i=1;i<=4;i++)
	{
		cin>>s;
		if(s=="10")
		{
			w[i]=10;continue;
		}
			if(s[0]==‘A‘) w[i]=1;
			if(s[0]==‘J‘)  w[i]=11;
			if(s[0]==‘K‘)  w[i]=13;
			if(s[0]==‘Q‘)  w[i]=12;
			if(s[0]<‘A‘)  w[i]=s[0]-‘0‘;
		}
		
	for(int i=1;i<=4;i++)
	{
		book[i]=1;
		dfs(w[i],1);
		book[i]=0;
	}
	cout<<ok<<endl;
	return 0;
} 

 

dfs(vijos113424点游戏)

标签:number   lan   使用   标记   blog   扑克   游戏   运算   pre   

原文地址:http://www.cnblogs.com/foreverpiano/p/6939633.html

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