日期:2014-05-17  浏览次数:20926 次

计算24点C#代码

C#代码,并修正前门c++代码的一个bug

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Calc24Points
{
    public class Cell
    {
        public enum Type
        {
            Number,
            Signal
        }
        public int Number;
        public char Signal;
        public Type Typ;
        public Cell Right;
        public Cell Left;

        /// <summary>
        /// 符号优先级
        /// </summary>
        public int Priority
        {
            get
            {
                if (Typ == Type.Signal)
                {
                    switch (Signal)
                    {
                        case '+': return 0;
                        case '-': return 0;
                        case '*': return 1;
                        case '/': return 1;
                        default: return -1;
                    }
                }
                return -1;
            }
        }

        /// <summary>
        /// 基本单元构造函数
        /// </summary>
        /// <param name="t">单元类型,数值或符号</param>
        /// <param name="num">数值</param>
        /// <param name="sig">符号</param>
        public Cell(Type t, int num, char sig)
        {
            Right = null;
            Left = null;
            Typ = t;
            Number = num;
            Signal = sig;
        }
        public Cell()
        {
            Right = null;
            Left = null;
            Number = 0;
            Typ = Type.Number;
        }
        public Cell(Cell c)
        {
            Right = null;
            Left = null;
            Number = c.Number;
            Signal = c.Signal;
            Typ = c.Typ;
        }
    }
    public class Calc24Points
    {

        string m_exp;
        bool m_stop;
        Cell[] m_cell;
        int[] m_express;
        StringWriter m_string;
        public Calc24Points(int n1, int n2, int n3, int n4)
        {
            m_cell = new Cell[8];
            m_cell[0] = new Cell(Cell.Type.Number, n1, '?');
            m_cell[1] = new Cell(Cell.Type.Number, n2, '?');
            m_cell[2] = new Cell(Cell.Type.Number, n3, '?');
            m_cell[3] = new Cell(Cell.Type.Number, n4, '?');
            m_cell[4] = new Cell(Cell.Type.Signal, 0, '+');
            m_cell[5] = new Cell(Cell.Type.Signal, 0, '-');
            m_cell[6] = new Cell(Cell.Type.Signal, 0, '*');
            m_cell[7] = new Cell(Cell.Type.Signal, 0, '/');
            m_stop = false;
            m_express = new int[7];
            m_string = new StringWriter();
            m_exp = null;
        }

        public override string ToString()
        {
            if (m_exp == null)
            {
                PutCell(0);
                m_exp = m_string.ToString();
            }
            if (m_exp != "") return m_exp;
            return null;
        }

        /// <summary>
        /// 在第n位置放置一个单元
        /// </summary>
        /// <param name="n"></param>
        void PutCell(int n)
        {
            if (n >= 7)
            {
                if (Calculate())
                {
                    m_stop = true;
                    Formate();
                }
                return;
            }
            int end = 8;
            if (n < 2) end = 4;
            for (int i = 0; i < end; ++i)
            {
                m_express[n] = i;
                if (CheckCell(n)) PutCell(n + 1);
                if (m_stop) break;
            }
        }

        /// <summary>
        /// 检查当前放置是否合理
        /// </summary>
        /// <param name="n"></param>
        /// <returns></returns>
        bool CheckCell(int n)
        {
            int nums = 0, sigs = 0;
            for (int i = 0; i <= n; ++i)
            {
                if (m_cell[m