Solution.java
上传用户:njled888
上传日期:2007-01-07
资源大小:29k
文件大小:9k
源码类别:

游戏

开发平台:

Java

  1. /*
  2.  * @(#)Solution.java Version 1.0 98/03/12
  3.  * 
  4.  * Copyright (c) 1998 by Huahai Yang
  5.  * 
  6.  * Use at your own risk. I do not guarantee the fitness of this 
  7.  * software for any purpose, and I do not accept responsibility for 
  8.  * any damage you do to yourself or others by using this software.
  9.  * This file may be distributed freely, provided its contents 
  10.  * are not tampered with in any way.
  11.  *
  12.  */
  13. import java.util.Vector;
  14. /**
  15.  * Given 4 integers, trying to form an expression using +, -, *, /,  
  16.  * ( and ) so that the value of this expression equals 24
  17.  */
  18. public class Solution 
  19. {
  20.    // vector to store 4 integers
  21.    static Vector numbers; 
  22.   
  23.    // flag to indicate whether there is solution
  24.    boolean hasSolution;
  25.    
  26.    // final expression
  27.    Vector theSolution = null;
  28.    
  29.    // the value of final expression
  30.    double theResult;
  31.    
  32.    /* in order to avoid combination explosion, construct a list of 
  33.     * valid positions for both numbers and operators as following:
  34.     *    0  1  2  3  4  5  6  7  8  9 10 11 12
  35.     *    (  n  o  (  n  )  o  (  n  )  o  n  )
  36.     * 
  37.     *    n - number, o - operator
  38.     */ 
  39.     
  40.    static final int TOTAL_POSITION = 13;
  41.    
  42.    // valid number locations
  43.    static final int [] NUM_POSITION = { 1, 4, 8, 11 }; 
  44.    
  45.    // valid number combinations
  46.    static Integer [][] numCombin;
  47.    
  48.    // valid operator locations
  49.    static final int [] OP_POSITION = { 2, 6, 10 };
  50.    
  51.    // valid operator combinations
  52.    static int [][] opCombin;
  53.    
  54.    // valid parenthesis locations
  55.    static final int [] PAREN_POSITION = { 0, 3, 5, 7, 9, 12 };
  56.    
  57.    // valid parenthesis combination, 0-no, 1-open, 2-close
  58.    static final int [][] PAREN_COMBIN = 
  59.    { 
  60.       { 0, 0, 0, 0, 0, 0 },
  61.       { 1, 0, 2, 0, 0, 0 },
  62.       { 1, 0, 0, 0, 2, 0 },
  63.       { 0, 1, 0, 0, 2, 0 },
  64.       { 0, 1, 0, 0, 0, 2 },
  65.       { 0, 0, 0, 1, 0, 2 },
  66.       { 1, 0, 2, 1, 0, 2 },
  67.    };  // PAREN_COMBIN
  68.    
  69.    /**
  70.     * Constructs a solution, given 4 integers
  71.     * @param num0 the first number
  72.     * @param num1 the second number
  73.     * @param num2 the third number
  74.     * @param num3 the fouth number
  75.     */
  76.    public Solution(int num0, int num1, int num2, int num3)
  77.    {
  78.       numbers = new Vector(4);
  79.             
  80.       numbers.addElement(new Integer(num0));
  81.       numbers.addElement(new Integer(num1));
  82.       numbers.addElement(new Integer(num2));
  83.       numbers.addElement(new Integer(num3));
  84.       
  85.       searchSolution();
  86.                
  87.    } // 4 param constructor  
  88.    
  89.    /**
  90.     * Gets solution expression
  91.     * @return one solution expressio as a vector
  92.     */
  93.    public Vector getSolution()
  94.    {
  95.       return theSolution;
  96.    } //getSolution  
  97.    
  98.    /**
  99.     * Judges if there is solution for this 4 number
  100.     * @return  <code>true</code> if has solution
  101.     *          <code>false</code> if no solution
  102.     */          
  103.    public boolean hasSolution()
  104.    {
  105.       return hasSolution;
  106.    } // hasSolution  
  107.    /**
  108.     * Constructs a 4 number permutation matrix
  109.     */
  110.    static private void numberCombination()
  111.    {
  112.       Vector tmpNumbers = new Vector(4);
  113.       numCombin = new Integer [24][4];
  114.       int count = 0;
  115.       
  116.       for(int i = 0; i < 4; i++)
  117.       {  
  118.          for(int j = 0; j < 3; j++)
  119.          {
  120.             for(int k = 0; k < 2; k++)
  121.             {
  122.                tmpNumbers = (Vector)numbers.clone();
  123.                
  124.                numCombin[count][0] = (Integer)tmpNumbers.elementAt(i);
  125.                tmpNumbers.removeElementAt(i);   
  126.                
  127.                numCombin[count][1] = (Integer)tmpNumbers.elementAt(j);
  128.                tmpNumbers.removeElementAt(j);
  129.                
  130.                numCombin[count][2] = (Integer)tmpNumbers.elementAt(k);
  131.                tmpNumbers.removeElementAt(k);
  132.                
  133.                numCombin[count][3] = (Integer)tmpNumbers.elementAt(0);
  134.                tmpNumbers.removeElementAt(0);
  135.                
  136.                count++;
  137.                
  138.             } // for k
  139.          } // for j
  140.       } // for i   
  141.    } // numberCombination
  142.    
  143.    /**
  144.     * Constructs an operator combination matrix
  145.     */
  146.    static private void operatorCombination()
  147.    {   
  148.       opCombin = new int [64][3];
  149.       int count = 0;
  150.       
  151.       for(int i = 0; i < 4; i++)
  152.       {
  153.          for(int j = 0; j < 4; j++)
  154.          {
  155.             for(int k = 0; k < 4; k++)
  156.             {         
  157.                opCombin[count][0] = i;
  158.                opCombin[count][1] = j;
  159.                opCombin[count][2] = k;
  160.                
  161.                count++;
  162.                
  163.             } // for k
  164.          } // for j
  165.       } // for i   
  166.    } // operatorCombination
  167.    
  168.    /**
  169.     * Uses enumeration to find a valid solution
  170.     */
  171.    private void searchSolution()
  172.    {
  173.       Character whiteSpace = new Character(' '),
  174.                 openParen = new Character('('),
  175.                 closeParen = new Character(')'),
  176.                 addition = new Character('+'),
  177.                 subtract = new Character('-'),
  178.                 multiply = new Character('*'),
  179.                 division = new Character('/');
  180.       
  181.       Vector tmpExpression = new Vector(TOTAL_POSITION); 
  182.       
  183.       int i, j, k;  // three simple loop variables
  184.       int count = 0;
  185.       
  186.       numberCombination();   
  187.       operatorCombination();
  188.             
  189.       // fill with whitespaces
  190.       for(i = 0; i < TOTAL_POSITION; i++)
  191.       {
  192.          tmpExpression.addElement(whiteSpace);
  193.       } // for   
  194.       // search all the possible combination:
  195.       // number * parenthesis * operator
  196.       for(int num = 0; num < 24; num++)
  197.       {
  198.          for(int paren = 0; paren < 7; paren++)
  199.          {
  200.             for(int op = 0; op < 64; op++)
  201.             {
  202.                // fill in numbers
  203.                for(i = 0; i < 4; i++)
  204.                {
  205.                   tmpExpression.setElementAt( numCombin[num][i], 
  206.                         NUM_POSITION[i]);
  207.                } // for numbers
  208.                
  209.                // fill in parenthesis
  210.                for(i = 0; i < 6; i++)
  211.                {
  212.                   switch ( PAREN_COMBIN[paren][i] )
  213.                   {
  214.                      case 1:
  215.                         tmpExpression.setElementAt(
  216.                            openParen, PAREN_POSITION[i]);
  217.                         break;
  218.                      case 2:
  219.                         tmpExpression.setElementAt(
  220.                            closeParen, PAREN_POSITION[i]);
  221.                         break;
  222.                      case 0:
  223.                         tmpExpression.setElementAt(
  224.                            whiteSpace, PAREN_POSITION[i]);
  225.                         break;
  226.                   } // switch
  227.                } // for parenthesis
  228.                
  229.                // fill in operators
  230.                for(i = 0; i < 3; i++)
  231.                {
  232.                   switch ( opCombin[op][i] )
  233.                   {
  234.                      case 0:
  235.                         tmpExpression.setElementAt(
  236.                            addition, OP_POSITION[i]);
  237.                         break;
  238.                      case 1:
  239.                         tmpExpression.setElementAt(
  240.                            subtract, OP_POSITION[i]);
  241.                         break;
  242.                      case 2:
  243.                         tmpExpression.setElementAt(
  244.                            multiply, OP_POSITION[i]);
  245.                         break;
  246.                      case 3:
  247.                         tmpExpression.setElementAt(
  248.                            division, OP_POSITION[i]);
  249.                         break;   
  250.                   } // switch
  251.                } // for operator
  252.                
  253.                // evaluate the generated expression               
  254.                try
  255.                {
  256.                   theResult = new Expression(tmpExpression).getValue();
  257.                } // try
  258.                catch (IllegalExpressionException e)
  259.             {
  260.                // expression format error, keep trying
  261.                continue;
  262.             } // catch
  263.             
  264.             if( theResult == 24.0 )
  265.             {
  266.                // we found the solution
  267.                hasSolution = true;
  268.                theSolution = tmpExpression;
  269.                return;
  270.             } // if hasSolution
  271.          } // for op
  272.       } // for paren
  273.    } // for num   
  274.    
  275.    // searched all the combination, no solution
  276.    hasSolution = false;
  277.    theSolution = null;
  278.    
  279. } // searchSolution   
  280.                   
  281. } // Solution