算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(); }