private void button1_Click(object sender, EventArgs e)
        {
            Expression expression = new Expression();
            Thinker thinker = new Thinker(expression);
            List<int> card = new List<int>();
            int target = 24;
            if ((n1.Text== string.Empty)||( n2.Text== string.Empty )||( n3.Text== string.Empty) || (n4.Text==string.Empty)) {
                MessageBox.Show("请输入完整的四个数字!");
                return;
            }
            if ((int.Parse(n1.Text) < 0) ||( int.Parse(n1.Text) > 13)) {
                MessageBox.Show("第一个数溢出,重新输入!");
                n1.Focus();
                return;
            }
            if ((int.Parse(n2.Text) < 0) ||( int.Parse(n2.Text) > 13))
            {
                MessageBox.Show("第二个数溢出,重新输入!");
                n2.Focus();
                return;
            }
            if ((int.Parse(n3.Text) < 0) ||( int.Parse(n3.Text) > 13))
            {
                MessageBox.Show("第三个数溢出,重新输入!");
                n3.Focus();
                return;
            }
            if ((int.Parse(n4.Text) < 0) || (int.Parse(n4.Text) > 13))
            {
                MessageBox.Show("第四个数溢出,重新输入!");
                n4.Focus();
                return;
            }
            card.Add(int.Parse(this.n1.Text));
            card.Add(int.Parse(this.n2.Text));
            card.Add(int.Parse(this.n3.Text));
            card.Add(int.Parse(this.n4.Text));
            listBox1.Items.Clear();
            thinker.count(card, card.Count - 1, target, listBox1);
            if (listBox1.Items.Count==0)
            {
                MessageBox.Show("无法组成24点!!");
            }
        }

解决方案 »

  1.   

    首先写两个类,第一个类是: Expression,
    第二个类为:Thinker
    代码分别如下:
    Expression.cs
    using System;
    using System.Collections.Generic;
    using System.Text;namespace _24点
    {
        public class Expression
        {
            private List<int> _num = new List<int>();
            private List<String> _sign = new List<String>();
            public void add(int num)
            {
                _num.Add(num);
            }
            public void add(String sign)
            {
                _sign.Add(sign);
            }
            private int getPriority(String sign)
            {
                if (sign.Equals("+")) return 1;
                if (sign.Equals("-")) return 1;
                if (sign.Equals("*")) return 2;
                if (sign.Equals("/")) return 2;
                return -1;
            }
            private String toString(int layer)
            {
                if (layer == 0)
                {
                    return _num[0] + _sign[0] + _num[1];
                }
                else
                {
                    String result = this.toString(layer - 1);
                    if (getPriority(_sign[layer]) > getPriority(_sign[layer - 1]))
                        result = "(" + result + ")";
                    result += _sign[layer] + _num[layer + 1];
                    return result;
                }
            }
            public String toString()
            {
                return toString(2);
            }
            public void clear()
            {
                _num.Clear();
                _sign.Clear();
            }
        }
    }
      

  2.   

    Thinker.cs
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Collections;//add
    using System.Windows.Forms;
    namespace _24点
    {
        public class Thinker
        {
            private Expression _expression;
            public Thinker(Expression expression)
            {
                _expression = expression;
            }
            public bool count(List<int> array, int num, int target, ListBox box)
            {
                if (num == 1)
                {
                    if ((array[0] + array[1]) == target)
                    {
                        _expression.add(array[0]);
                        _expression.add(array[1]);
                        _expression.add("+");
                        return true;
                    }
                    if ((array[0] - array[1]) == target)
                    {
                        _expression.add(array[0]);
                        _expression.add(array[1]);
                        _expression.add("-");
                        return true;
                    }
                    if ((array[1] - array[0]) == target)
                    {
                        _expression.add(array[1]);
                        _expression.add(array[0]);
                        _expression.add("-");
                        return true;
                    }
                    if ((array[0] * array[1]) == target)
                    {
                        _expression.add(array[0]);
                        _expression.add(array[1]);
                        _expression.add("*");
                        return true;
                    }
                    if ((array[0] * target == array[1]))
                    {
                        _expression.add(array[1]);
                        _expression.add(array[0]);
                        _expression.add("/");
                        return true;
                    }
                    if ((array[1] * target == array[0]))
                    {
                        _expression.add(array[0]);
                        _expression.add(array[1]);
                        _expression.add("/");
                        return true;
                    }
                    return false;
                }
                else
                {
                    for (int current = 0; current < array.Count; current++)
                    {
                        List<int> array1 = new List<int>();
                        int currentNum = array[current];
                        for (int i = 0; i < array.Count; i++)
                            if (i != current) array1.Add(array[i]); //array
                        if (count(array1, num - 1, target - currentNum, box))
                        {
                            _expression.add("+");
                            _expression.add(currentNum);
                            if (num == 3)
                            {
                                box.Items.Add(_expression.toString());
                                //MessageBox.Show(_expression.toString());
                                _expression.clear();
                            }
                            if (num != 3) return true;
                        }
                        if (count(array1, num - 1, target + currentNum, box))
                        {
                            _expression.add("-");
                            _expression.add(currentNum);
                            if (num == 3)
                            {
                                box.Items.Add(_expression.toString());
                                _expression.clear();
                            }
                            if (num != 3) return true;
                        }
                        if (count(array1, num - 1, target * currentNum, box))
                        {
                            _expression.add("/");
                            _expression.add(currentNum);
                            if (num == 3)
                            {
                                box.Items.Add(_expression.toString());
                                _expression.clear();
                            }
                            if (num != 3) return true;
                        }
                        if (target % currentNum == 0)
                        {
                            if (count(array1, num - 1, (int)(target / currentNum), box))
                            {
                                _expression.add("*");
                                _expression.add(currentNum);
                                if (num == 3)
                                {
                                    box.Items.Add(_expression.toString());
                                    _expression.clear();
                                }
                                if (num != 3) return true;
                            }
                        }
                    }
                    return false;
                }
            }
        }
    }
      

  3.   

    思路,算法在这两行代码里
    Expression expression = new Expression(); 
    Thinker thinker = new Thinker(expression); 
    把这些代码贴出来,看看
      

  4.   

    运行效果可以将结果表达式放到列表框中了。
    if (num != 3) return true;可否去掉?
    我去掉就不对了?