算24點 c#實現

算24點 就是 給 四個數字,這四個數字 值的範圍是1到13,經過 加減乘除 的辦法 使得結果是 24node

實現辦法算法

class Node
        {
            public Node(double val,String e)
            {
                value = val;
                exp = e;
            }
            public Node()
            {

            }
           public double value;
           public String exp;
        }

有這樣一個節點,數值部分存的就是 計算的數值結果,初始就是 輸入的數值。數組

字符串部分記錄的就是 兩個數字計算的過程spa

舉個例子 輸入 兩個值 1 2 和另外2個值 ,那麼就初始兩個 節點 node1 node2, 假設另外兩個節點 爲 node3 node4code

node1.value=1,node1.exp="1",blog

node2.value=2,node2.exp="2",遞歸

若是這兩個值進行一個加運算,獲得一個新的節點node5字符串

node5.value=3,node5.exp="(1+2)",string

這樣的話就剩三個節點 node3 node4 node5 進行接下來的計算就可怡it

計算的過程就是遞歸,終止條件就是 輸入的數組只有兩個值,若是這兩個值 經過+ - * / 可以計算獲得24 就輸出,不然就終止,

整個算法以下,沒有去重

    class Node
        {
            public Node(double val,String e)
            {
                value = val;
                exp = e;
            }
            public Node()
            {

            }
           public double value;
           public String exp;
        }
        static void countProcess(List<Node> list)
        {
            if (list.Count < 2)
                return;
            if (list.Count == 2)
            {
                if (list[0].value + list[1].value == 24)
                {
                    Console.WriteLine(list[0].exp+"+"+list[1].exp);
               }
                if (list[0].value * list[1].value == 24)
                {
                    Console.WriteLine(list[0].exp + "*" + list[1].exp);
                }
                if (list[0].value / list[1].value == 24)
                {
                    Console.WriteLine(list[0].exp + "/" + list[1].exp);
                }
                if (list[1].value / list[0].value == 24)
                {
                    Console.WriteLine(list[1].exp + "/" + list[0].exp);
                }
                if (list[0].value - list[1].value == 24)
                {
                    Console.WriteLine(list[0].exp + "-" + list[1].exp);
                }
                if (list[1].value - list[0].value == 24)
                {
                    Console.WriteLine(list[1].exp + "-" + list[0].exp);
                }
                return;
           }
            for (int i = 0; i < list.Count; i++)
            {
                for (int j = i + 1; j < list.Count; j++)
                {
                    List<Node> clist = new List<Node>(list);
                    //clist.CopyTo()
                    //clist = list;
                    //list.CopyTo(clist);
                    clist.Remove(list[i]);
                    clist.Remove(list[j]);

                    double a=list[i].value+list[j].value;
                    Node aa = new Node();
                    aa.value = a;
                    aa.exp = "("+list[i].exp + "+" + list[j].exp+")";
                    clist.Add(aa);
                    countProcess(clist);
                    clist.Remove(aa);

                    double b = list[i].value * list[j].value;
                    Node bb = new Node();
                    bb.value = b;
                    bb.exp = "(" + list[i].exp + "*" + list[j].exp + ")";
                    clist.Add(bb);
                    countProcess(clist);
                    clist.Remove(bb);

                    double c = list[i].value - list[j].value;
                    Node cc = new Node();
                    cc.value = c;
                    cc.exp = "(" + list[i].exp + "-" + list[j].exp + ")";
                    clist.Add(cc);
                    countProcess(clist);
                    clist.Remove(cc);


                    double d = list[j].value - list[i].value;
                    Node dd = new Node();
                    dd.value = d;
                    dd.exp = "(" + list[j].exp + "-" + list[i].exp + ")";
                    clist.Add(dd);
                    countProcess(clist);
                    clist.Remove(dd);

                    if (list[j].value != 0)
                    {
                        double e = list[i].value / list[j].value;
                        Node ee = new Node();
                        ee.value = e;
                        ee.exp = "(" + list[i].exp + "/" + list[j].exp + ")";
                        clist.Add(ee);
                        countProcess(clist);
                        clist.Remove(ee);
                    }


                    if (list[i].value != 0)
                    {
                        double f = list[j].value / list[i].value;
                        Node ff = new Node();
                        ff.value = f;
                        ff.exp = "(" + list[j].exp + "/" + list[i].exp + ")";
                        clist.Add(ff);
                        countProcess(clist);
                        clist.Remove(ff);
                    }
                    

                    
                   
                }
            }

        }
        static void Main(string[] args)
        {
            String a = Console.ReadLine();
            String b = Console.ReadLine();
            String c = Console.ReadLine();
            String d = Console.ReadLine();

            List<Node> list = new List<Node>();
            list.Add(new Node(Convert.ToDouble(a),a));
            list.Add(new Node(Convert.ToDouble(b), b));
            list.Add(new Node(Convert.ToDouble(c), c));
            list.Add(new Node(Convert.ToDouble(d), d));

            countProcess(list);

            Console.ReadKey();

        }

 

相關文章
相關標籤/搜索