HDU 1427 速算24点-DFS


HDU 1427 速算24点-DFS
Related: Compute 24 每日一题(13)――24点 (分治&递归)
速算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
枚举数字和运算符,DFS即可,注意题目要求计算过程中都不能出现小数,所以做除法时稍作处理
枚举数组可用algorithm里的next_permutation
The next_permutation() function attempts to transform the given range of elements [start,end) into the next lexicographically greater permutation of elements. If it succeeds, it returns true, otherwise, it returns false.
http://www.xuebangwang.com/article-7594-1.html
void dfs(int sum,int next,int p) //表示当前已经算出的值是sum,括号中算出的值是next,当前使用的卡片下标为p
{
    if(p==4) //正在用第4张牌
    {
        if(sum+next==24||sum-next==24||sum*next==24)
            flag=true;
        if(next!=0&&sum%next==0&&sum/next==24)
            flag=true;
        return;
    }
    //1、不加括号
    dfs(sum+next,cardNum[p+1],p+1);
    dfs(sum-next,cardNum[p+1],p+1);
    dfs(sum*next,cardNum[p+1],p+1);
    if(next!=0&&sum%next==0)
        dfs(sum/next,cardNum[p+1],p+1);
    //2、加括号,则需要改变运算顺序
    dfs(sum,next+cardNum[p+1],p+1);
    dfs(sum,next-cardNum[p+1],p+1);
    dfs(sum,next*cardNum[p+1],p+1);
    if(cardNum[p+1]!=0&&next%cardNum[p+1]==0)
        dfs(sum,next/cardNum[p+1],p+1);
}
        sort(cardNum+1,cardNum+5);
        do
        {
            dfs(cardNum[1],cardNum[2],2);
        }while(!flag&&next_permutation(cardNum+1,cardNum+5));
http://blog.csdn.net/u014492609/article/details/40268385
http://java-mans.iteye.com/blog/1642726
  1. int num[4];  
  2. int cmp(const void *a,const void *b)  
  3. {  
  4.     return *(int *)a-*(int *)b;  
  5. }  
  6. void dfs(int sum,int cur,int m)  
  7. {  
  8.     if(flag)  
  9.     return;  
  10.     if(m==3)  
  11.     {  
  12.         if(sum+cur==24||sum-cur==24||sum*cur==24)  
  13.         flag=1;  
  14.         if(cur!=0&&sum%cur==0&&sum/cur==24)  
  15.         flag=1;  
  16.         return;  
  17.     }  
  18.     dfs(sum+cur,num[m+1],m+1);  //先计算前一部分  
  19.     dfs(sum-cur,num[m+1],m+1);  
  20.     dfs(sum*cur,num[m+1],m+1);  
  21.     if(cur!=0&&sum%cur==0)  
  22.     dfs(sum/cur,num[m+1],m+1);  
  23.     dfs(sum,cur+num[m+1],m+1);  //先计算后一部分,相当于加括号  
  24.     dfs(sum,cur-num[m+1],m+1);  
  25.     dfs(sum,cur*num[m+1],m+1);  
  26.     if(num[m+1]!=0&&cur%num[m+1]==0)  
  27.     dfs(sum,cur/num[m+1],m+1);  
  28. }  

  1.         qsort(num,4,sizeof(num[0]),cmp);  
  2.         flag=0;  
  3.         do  
  4.         {  
  5.             dfs(num[0],num[1],1);  
  6.         }while(next_permutation(num,num+4)&&!flag);  
  7.         if(flag)  
  8.         printf("Yes\n");  
  9.         else  
  10.         printf("No\n");  

http://www.voidcn.com/blog/su20145104009/article/p-3671590.html

https://moonstonelin.wordpress.com/2016/04/06/caculate-24/
public List<string> Generate24(int[] cards)
{
    List<string> result = new List<string>();
    Dictionary<string, int> dict = GenerateHelper(cards);
    foreach (var kp in dict)
    {
        if (!result.Contains(kp.Key) && (kp.Value == 24))
        {
            result.Add(kp.Key);
        }
    }
    return result;
}
private Dictionary<string, int> GenerateHelper(int[] cards)
{
    Dictionary<string, int> dict = new Dictionary<string, int>();
    if (cards.Length == 1)
    {
        dict.Add(cards[0].ToString(), cards[0]);
    }
    if (cards.Length == 2)
    {
        this.AddEntries(dict, cards[0].ToString(), cards[1].ToString(), cards[0], cards[1]);
    }
    if (cards.Length == 3)
    {
        List<int> cards1 = new List<int>();
        List<int> cards2 = new List<int>();
        for (int i = 0; i <= 2; i++)
        {
            Swap(cards, 0, i);
            Dictionary<string, int> dict1 = GenerateHelper(new int[]{ cards[0] });
            Dictionary<string, int> dict2 = GenerateHelper(new int[] { cards[1], cards[2] });
            this.Construct(dict, dict1, dict2);
        }
    }
    if (cards.Length == 4)
    {
        List<int> cards1 = new List<int>();
        List<int> cards2 = new List<int>();
        for (int i = 0; i <= 3; i++)
        {
            Swap(cards, 0, i);
            Dictionary<string, int> dict1 = GenerateHelper(new int[] { cards[0] });
            Dictionary<string, int> dict2 = GenerateHelper(new int[] { cards[1], cards[2], cards[3] });
            this.Construct(dict, dict1, dict2);
        }
        for (int i = 0; i <= 3; i++)
        {
            for (int j = i + 1; j <= 3; j++)
            {
                Swap(cards, 0, i);
                Swap(cards, 1, j);
                Dictionary<string, int> dict1 = GenerateHelper(new int[] { cards[0], cards[1] });
                Dictionary<string, int> dict2 = GenerateHelper(new int[] { cards[2], cards[3] });
                this.Construct(dict, dict1, dict2);
            }
        }
    }
    return dict;
}
private void Swap(int[] input, int i, int j)
{
    int tmp = input[i];
    input[i] = input[j];
    input[j] = tmp;
}
private void Construct(Dictionary<string, int> dict, Dictionary<string, int> dict1, Dictionary<string, int> dict2)
{
    foreach (var kp1 in dict1)
    {
        foreach (var kp2 in dict2)
        {
            this.AddEntries(dict, kp1.Key, kp2.Key, kp1.Value, kp2.Value);
        }
    }
}
private void AddEntries(Dictionary<string, int> dict, string k1, string k2, int v1, int v2)
{
    if (!dict.ContainsKey("(" + k1 + "+" + k2 + ")"))
    {
        dict.Add("(" + k1 + "+" + k2 + ")", v1 + v2);
    }
    if (!dict.ContainsKey("(" + k1 + "-" + k2 + ")"))
    {
        dict.Add("(" + k1 + "-" + k2 + ")", v1 - v2);
    }
    if (!dict.ContainsKey("(" + k1 + "*" + k2 + ")"))
    {
        dict.Add("(" + k1 + "*" + k2 + ")", v1 * v2);
    }
    if ((v2 != 0) && !dict.ContainsKey("(" + k1 + "/" + k2 + ")"))
    {
        dict.Add("(" + k1 + "/" + k2 + ")", v1 / v2);
    }
}
http://www.voidcn.com/blog/u014664226/article/p-4336216.html
int oper(int i, int m, int n) {       //枚举四种运算符 
 if(i == 1) return m + n;
 if(i == 2) return m - n;
 if(i == 3) return m * n;
 if(n == 0 || m % n != 0) return INF;
 else return m / n;
}

bool calcu1(int i, int j, int k) {   //计算顺序1 ((a@b)@c)@d 
 int tmp1 = oper(i, a[0], a[1]);
 int tmp2 = oper(j, tmp1, a[2]);
 int tmp3 = oper(k, tmp2, a[3]);
 if(tmp3 == 24 || tmp3 == -24) return true;
 return false; 
}

bool calcu2(int i, int j, int k) {   //计算顺序2 (a@b)@(c@d) 
 int tmp1 = oper(i, a[0], a[1]);
 int tmp2 = oper(k, a[2], a[3]);
 int tmp3 = oper(j, tmp1, tmp2);
 if(tmp3 == 24 || tmp3 == -24) return true;
 return false;
}
  sort(a, a+4);
  do {
   for(int i = 1; i <= 4; i++)
    for(int j = 1; j <= 4; j++)
     for(int k = 1; k <= 4; k++) {
      if(calcu1(i, j, k) || calcu2(i, j, k)) flag = 1;
     }
  } while(next_permutation(a, a+4) && !flag);


Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts