HDU 1427-速算24點(DFS)

大白QQly成長日記發表於2018-09-20

速算24點相信絕大多數人都玩過。就是隨機給你四張牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'運算子以及括號改變運算順序,使得最終運算結果為24(每個數必須且僅能用一次)。遊戲很簡單,但遇到無解的情況往往讓人很鬱悶。你的任務就是針對每一組隨機產生的四張牌,判斷是否有解。我們另外規定,整個計算過程中都不能出現小數。

Input

每組輸入資料佔一行,給定四張牌。

Output

每一組輸入資料對應一行輸出。如果有解則輸出"Yes",無解則輸出"No"。

Sample Input


 

A 2 3 6

3 3 8 8

Sample Output


 

Yes

No

思路:赤裸裸的爆搜。暴力搜尋全排列,需要注意使用全排列前要排個序。(忘了,調好久......)

注意一下如何處理括號的優先順序:只有4個數,所以最多有2對括號,也就是說這個表示式分成內外2部分,從這一點入手,在暴力的時候分一下。在原先的4則運算下再加一個分開的優先運算即可。詳情見程式碼

程式碼如下:

#include<set>
#include<map>
#include<list>
#include<deque>
#include<cmath>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<stdio.h>
#include<sstream>
#include<stdlib.h>
#include<string.h>
//#include<ext/rope>
#include<iostream>
#include<algorithm>
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
#define per(i,a,b) for(int i=a;i<=b;++i)
#define LL long long 
#define swap(a,b) {int t=a;a=b;b=t} 
using namespace std;
//using namespace __gnu_cxx;
int p[4],fag=0;
void fun(char a,char b,int x)
{
	if(a=='A') p[x]=1;
	else if(a=='J') p[x]=11;
	else if(a=='Q') p[x]=12;
	else if(a=='K') p[x]=13;
	else if(a=='1'&&b=='0') p[x]=10;
	else p[x]=a-'0';
}
void dfs(int x,int y,int z)
{
	if(fag==1) return ;
	if(x==3) 
	{
		if(y+z==24) fag=1;
		if(y-z==24) fag=1;
		if(y*z==24) fag=1;
		if(z!=0&&y%z==0&&y/z==24) fag=1;
		return ;
	}
	dfs(x+1,y+z,p[x+1]);
	dfs(x+1,y-z,p[x+1]);
	dfs(x+1,y*z,p[x+1]);
	if(z!=0&&y%z==0) dfs(x+1,y/z,p[x+1]);
	dfs(x+1,y,z+p[x+1]);
	dfs(x+1,y,z-p[x+1]);
	dfs(x+1,y,z*p[x+1]);
	if(p[x+1]!=0&&z%p[x+1]==0) dfs(x+1,y,z/p[x+1]);
}
int main()
{
	string a,b,c,d;
	while(cin>>a>>b>>c>>d)
	{ 
	    fag=0;
	    fun(a[0],a[1],0);fun(b[0],b[1],1);
	    fun(c[0],c[1],2);fun(d[0],d[1],3);
	    sort(p,p+4);
	    do{
	    	dfs(1,p[0],p[1]);
		}while(next_permutation(p,p+4)&&fag==0);
	    if(fag==1) printf("Y\n");
	    else printf("N\n");
	}
	return 0;
}

 

相關文章