1. 程式人生 > >Hihocode 1304

Hihocode 1304

數字 符號 pan txt color str 這樣的 fab scanf

http://hihocoder.com/problemset/problem/1304

題意:就是四個數字加上運算符,看看是否可以構成二十四點。

思路:這個題目肯定是個DFS

搜索是這麽搜的,首先有4個數字,排列的話那麽就會有4!=24中組合,然後運算符,在運算符號這裏,我們進行拓展,也就是由4個運算符拓展成六個運算符,+,-,*,/,~-,~/。

這裏的~-意思就是減數和被減數互換一下,~/一樣的意思。這樣的話,那麽我們只有兩種組合

(((a ⊙ b) ⊙ c ) ⊙ d)

((a ⊙ b) ⊙ (c ⊙ d))

之後我們進行枚舉就可以。

代碼有點長,不過看別人的,確實有更加好的辦法,這個還是算比較笨的吧。

 1 //最初的夢想,緊握手上
 2 
 3 
 4 #include <stdio.h>
 5 #include <string.h>
 6 #include <math.h>
 7 #define eps 1e-5
 8 bool used[4];
 9 int num[4];
10 int nownum[4];
11 int ope[3];
12 double judge(double a,double b,int x)    //運算符
13 {
14     switch (x)
15     {
16          case 1:
17             return
a+b; 18 case 2: 19 return a-b; 20 case 3: 21 return a*b; 22 case 4: 23 if(fabs(b-0)>eps) 24 return a/b; 25 else 26 return -999999; 27 case 5: 28 return b-a; 29 case 6:
30 if(fabs(a-0)>eps) 31 return b/a; 32 else return -999999; 33 } 34 35 } 36 double jud1() //第一種判斷 37 { 38 return judge(judge(judge(nownum[0],nownum[1],ope[0]),nownum[2],ope[1]),nownum[3],ope[2]); 39 40 } 41 42 double jud2() //第二種判斷 43 { 44 return judge(judge(nownum[0],nownum[1],ope[0]),judge(nownum[2],nownum[3],ope[1]),ope[2]); 45 } 46 bool calc(int deep) //枚舉運算符 47 { 48 if(deep>2) 49 { 50 if(fabs(jud1()-24)<eps) 51 return true; 52 if(fabs(jud2()-24)<eps) 53 return true; 54 return false; 55 } 56 for(int i =1; i<=6; i++) 57 { 58 ope[deep] = i; 59 if(calc(deep+1)) 60 return true; 61 } 62 return false; 63 } 64 65 bool dfs(int deep) //枚舉數字 66 { 67 if(deep>3) 68 return calc(0); 69 for(int i = 0; i<4; i++) 70 if(used[i]) 71 { 72 used[i] = false; 73 nownum[deep] = num[i]; 74 if(dfs(deep+1)) 75 return true; 76 used[i] = true; 77 } 78 return false; 79 } 80 81 82 int main() 83 { 84 // freopen("in.txt","r",stdin); 85 int a,b,c,d; 86 int t; 87 scanf("%d",&t); 88 while(t--) 89 { 90 memset(used,true,sizeof(used)); 91 scanf("%d%d%d%d",&num[0],&num[1],&num[2],&num[3]); 92 if(dfs(0)) 93 printf("Yes\n"); 94 else 95 printf("No\n"); 96 } 97 return 0; 98 }

Hihocode 1304