玩了下~~失败了~~先把今天的试验结果留这~~(可用~但有些不符合要求:()
明天再做:(
<?php
set_time_limit(10);
class Card
{
/**
 * 计算各种符号的结果
 */
public function getCountResult($a,$b)
{
$result = array();
$result[1] = $a+$b;
$result[2] = $a-$b;
$result[3] = $a*$b;
$result[4] = (!empty($b))?$a/$b:0;
return $result;
}
/**
 * 获取 2 张扑克的所有计算值
 */
public function getMyCard()
{
$cardNum = 3; # 牌数 调试时试用小数值快些:)
for($i=1;$i<=$cardNum;$i++)
{
for($j=1;$j<=$cardNum;$j++)
{
$result[] = $this->getCountResult($i,$j);
$Card[] = array($i,$j);
}
}
$myCard['Result'] = $result; # 结果集合
$myCard['Card'] = $Card; # 组成集合
return $myCard;
}
/**
 * 取得结果
 *
 */
public function getResult()
{
$result = $this->getMyCard();
foreach ($result['Result'] as $keyA => $valueA)
{
for($i=1;$i<=4;$i++)
{
foreach ($result['Result'] as $keyB => $valueB)
{
for($j=1;$j<=4;$j++)
{
$finalResult = $this->getCountResult($valueA[$i],$valueB[$j]); if (in_array(24,$finalResult)) # 结果
{
$symbol_AB = $i;
$symbol_BC = array_search(24,$finalResult); # b c 两牌之间的符号
$symbol_CD = $j; echo (
'('.$result['Card'][$keyA][0].
$this->getSymbol($symbol_AB).
$result['Card'][$keyA][1].')'.
$this->getSymbol($symbol_BC).'('.
$result['Card'][$keyB][0].
$this->getSymbol($symbol_CD).
$result['Card'][$keyB][1].')<br />'
);
}
}
}
}
}
}
/**
 * 获取计算符号
 */
public function getSymbol($symbolKey)
{
$symbol = null;
switch ($symbolKey)
{
case 1;
$symbol = '+';
break;
case 2;
$symbol = '-';
break;
case 3;
$symbol = '*';
break;
case 4;
$symbol = '/';
break;
}
return $symbol;
}
}
$card = new Card();
$card->getResult();
?>

解决方案 »

  1.   

    http://blog.csdn.net/jianshi051/archive/2007/06/14/1651903.aspx看来得回家学数学了:(
    又丢人了:(
      

  2.   

    <?php
    $result = array();
    foreach (range(1, 13) as $v1) {
    foreach (range(1, 13) as $v2) {
    foreach (range(1, 13) as $v3) {
    foreach (range(1, 13) as $v4) {
    foreach (array("+", "-", "*", "/") as $o1) {
    foreach (array("+", "-", "*", "/") as $o2) {
    foreach (array("+", "-", "*", "/") as $o3) {
    foreach (array("((%d %s %d) %s %d) %s %d", "(%d %s %d) %s (%d %s %d)", "(%d %s (%d %s %d)) %s %d", "%d %s ((%d %s %d) %s %d)", "%d %s (%d %s (%d %s %d))") as $order) {
    $e = sprintf($order, $v1, $o1, $v2, $o2, $v3, $o3, $v4);
    eval("\$r = ".$e.";");
    if (24 === $r) {
    $result[] = $e;
    }
    }
    }
    }
    }
    }
    }
    }
    }
    file_put_contents(dirname(__FILE__)."/24result.txt", implode("\n", $result));
    ?>
      

  3.   

    这样完成是不是有点牵强了.他说没有括号的.如果这样就行的话,把我原来的代码改了下.
    相当于用不同的方式构造出符号全排.
    得出的结果只有 10101 个.<?php
    set_time_limit(100);
    class Card
    {
    /**
         * 计算各种符号的结果
         */
    public function getCountResult($a,$b)
    {
    $result = array();
    $result[1] = $a.'+'.$b;
    $result[2] = $a.'-'.$b;
    $result[3] = $a.'*'.$b;
    $result[4] = (!empty($b))?$a.'/'.$b:0;#除0情况这里不存在.
    return $result;
    }
    /**
         * 获取 2 张扑克的所有计算值
         */    
    public function getMyCard()
    {
    $cardNum = 13; # 牌数 调试时试用小数值快些:)
    for($i=1;$i<=$cardNum;$i++)
    {
    for($j=1;$j<=$cardNum;$j++)
    {
    $result[] = $this->getCountResult($i,$j);
    $Card[] = array($i,$j);
    }
    }
    $myCard['Result'] = $result;    # 结果集合
    $myCard['Card'] = $Card;    # 组成集合
    return $myCard;
    }
    /**
         * 取得结果
         *
         */
    public function getResult()
    {
    $flushResult = null;
    $result = $this->getMyCard();
    foreach ($result['Result'] as $keyA => $valueA)
    {
    for($i=1;$i<=4;$i++)
    {
    foreach ($result['Result'] as $keyB => $valueB)
    {
    for($j=1;$j<=4;$j++)
    {
    $thisResult = $this->getCountResult($valueA[$i],$valueB[$j]);
    for ($k=1;$k<=4;$k++)
    { eval('$finalResult='.$thisResult[$k].';'); if ($finalResult == 24)    # 结果
    {
    $symbol_AB = $i;
    $symbol_BC = $k;    # b c 两牌之间的符号
    $symbol_CD = $j; $flushResult[] = (
    $result['Card'][$keyA][0].
    $this->getSymbol($symbol_AB).
    $result['Card'][$keyA][1].
    $this->getSymbol($symbol_BC).
    $result['Card'][$keyB][0].
    $this->getSymbol($symbol_CD).
    $result['Card'][$keyB][1]
    ); }
    }
    }
    }
    }
    }
    return $flushResult;
    }
    /**
     * 获取计算符号
     */
    public function getSymbol($symbolKey)
    {
    $symbol = null;
    switch ($symbolKey)
    {
    case 1;
    $symbol = '+';
    break;
    case 2;
    $symbol = '-';
    break;
    case 3;
    $symbol = '*';
    break;
    case 4;
    $symbol = '/';
    break;
    }
    return $symbol;
    }
    }
    $card = new Card();
    $flushResult = $card->getResult(); 
    file_put_contents(dirname(__FILE__)."/24result.txt", implode("\n", $flushResult));
    ?>
      

  4.   

    <html><head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>24</title>
    <style>
    INPUT{border: 1 solid #0099CC;}
    </style>
    </head><body link="#FFFFFF" vlink="#FFFFFF" alink="#FFFFFF">
    <script>
    /*-------------------------------------
    原理阐述:四个数字,判断怎样得到 24 可能而且没有重复的组合方式如下:可能的组合方式
    a+b+c+d
    a+(b+c)+d
    (a+b)+c+d
    a+b+(c+d)
    a+(b+c+d)
    (a+b+c)+d
    (a+b)+(c+d)
    (a+(b+c))+d
    ((a+b)+c)+d
    a+(b+(c+d))
    a+((b+c)+d) 依据这个规律,我们可以得出…… 下面这段代码~~ 哈哈……---------------------------------------*/
    var num = null;

    var sign = new Array("+","-","*","/");

    function returnSZ()
    {

    for(s1=0; s1<4; s1++)
    {
    for(s2=0; s2<4; s2++)
    {
    for(s3=0; s3<4; s3++)
    {
    for(n1=0; n1<4; n1++)
    {
    for(n2=0; n2<4; n2++)
    {
    if(n2==n1)
    continue;

    for(n3=0; n3<4; n3++)
    {
    if(n3==n1||n3==n2)
    continue;

    for(n4=0; n4<4; n4++)
    {
    if(n4==n1||n4==n2||n4==n3)
    continue;

    var str = "";

    /*--------------------- 可能的组合方式
    a+b+c+d
    a+(b+c)+d
    (a+b)+c+d
    a+b+(c+d)
    a+(b+c+d)
    (a+b+c)+d
    (a+b)+(c+d)
    (a+(b+c))+d
    ((a+b)+c)+d
    a+(b+(c+d))
    a+((b+c)+d)
    ----------------------*/

    str = num[n1]+  sign[s1]  +num[n2]+  sign[s2]  +num[n3]+  sign[s3]  +num[n4];
    if(judgeNum(str))
    {
    result.value=(str);
    return;
    }
    str = num[n1]+  sign[s1]  +"("+num[n2]+  sign[s2]  +num[n3]+")"+  sign[s3]  +num[n4];
    if(judgeNum(str))
    {
    result.value=(str);
    return;
    }
    str = "("+num[n1]+  sign[s1]  +num[n2]+")"+  sign[s2]  +num[n3]+  sign[s3]  +num[n4];
    if(judgeNum(str))
    {
    result.value=(str);
    return;
    }
    str = num[n1]+  sign[s1]  +num[n2]+  sign[s2]  +"("+num[n3]+  sign[s3]  +num[n4]+")";
    if(judgeNum(str))
    {
    result.value=(str);
    return;
    }
    str = num[n1]+  sign[s1]  +"("+num[n2]+  sign[s2]  +num[n3]+  sign[s3]  +num[n4]+")";
    if(judgeNum(str))
    {
    result.value=(str);
    return;
    }
    str = "("+num[n1]+  sign[s1]  +num[n2]+  sign[s2]  +num[n3]+")"+  sign[s3] +num[n4];
    if(judgeNum(str))
    {
    result.value=(str);
    return;
    }
    str = "("+num[n1]+  sign[s1]  +num[n2]+")"+ sign[s2]  +"("+num[n3]+  sign[s3]  +num[n4]+")";
    if(judgeNum(str))
    {
    result.value=(str);
    return;
    }
    str = "("+num[n1]+  sign[s1]  +"("+num[n2]+  sign[s2]  +num[n3]+"))"+  sign[s3]  +num[n4];
    if(judgeNum(str))
    {
    result.value=(str);
    return;
    }
    str = "(("+num[n1]+  sign[s1]  +num[n2]+")"+ sign[s2]  +num[n3]+")"+  sign[s3]  +num[n4];
    if(judgeNum(str))
    {
    result.value=(str);
    return;
    }
    str = num[n1]+  sign[s1]  +"("+num[n2]+  sign[s2]  +"("+num[n3]+  sign[s3]  +num[n4]+"))";
    if(judgeNum(str))
    {
    result.value=(str);
    return;
    }
    str = num[n1]+  sign[s1]  +"(("+num[n2]+  sign[s2]  +num[n3]+")"+  sign[s3]   +num[n4]+")";
    if(judgeNum(str))
    {
    result.value=(str);
    return;
    }


    }

    }

    }
    }
    }
    }
    }

    result.value=("这个好像不行吧~~~~");
    } function judgeNum(theline)
    {
    if(eval(theline)==24)
    return true;
    else
    return false;
    }function RunSZ()
    {
    var ArrayBox = document.getElementsByName("box");

    num = null;

    num = new Array();

    for(i=0;i<4;i++)
    {
    var str = ArrayBox[i].value;

    if(str=="")
    {
    alert("第"+(i+1)+"个数字没有填");
    ArrayBox[i].focus();
    return;
    }
    else
    {
    if(!str.match(/\D/g))
    num[i] = ArrayBox[i].value;
    else
    {
    alert("第"+(i+1)+"个数字有不为数字的字符");
    ArrayBox[i].focus();
    return;
    }
    }
    }


    returnSZ();

    }</script>
    <div align="center">
      <table border="0" width="324" style="font-family: 宋体; font-size: 9pt; border: 1 solid #0099CC" height="192" cellspacing="0" cellpadding="0">
        <tr>
          <td width="308" height="28" align="center" bgcolor="#0099CC" style="color: #FFFFFF" colspan="2">
            <p align="left">|| 24 点 游戏</td>
        </tr>
      <center>
        <tr>
          <td width="82" height="40" align="center" bgcolor="#0099CC" style="color: #FFFFFF; border-top: 1 solid #DDFFEF">第一个数字</td>
          <td width="226" height="40" align="center" bgcolor="#DDFFEF"><input type="text" name="box" size="20" ></td>
        </tr>
        <tr>
          <td width="82" height="40" align="center" bgcolor="#0099CC" style="color: #FFFFFF">第一个数字</td>
          <td width="226" height="40" align="center" bgcolor="#DDFFEF"><input type="text" name="box" size="20"></td>
        </tr>
        <tr>
          <td width="82" height="40" align="center" bgcolor="#0099CC" style="color: #FFFFFF">第三个数字</td>
          <td width="226" height="40" align="center" bgcolor="#DDFFEF"><input type="text" name="box" size="20"></td>
        </tr>
        <tr>
          <td width="82" height="40" align="center" bgcolor="#0099CC" style="color: #FFFFFF; border-bottom: 1 solid #DDFFEF">第四个数字</td>
          <td width="226" height="40" align="center" bgcolor="#DDFFEF"><input type="text" name="box" size="20"></td>
        </tr>
        <tr>
          <td width="82" height="60" align="center" bgcolor="#0099CC" style="color: #FFFFFF"><a href="javascript:;" onclick=RunSZ()>计算结果</a></td>
          <td width="226" height="60" align="center" bgcolor="#0099CC"><input type="text" id="result" size="25"></td>
        </tr>
      </table>
      </center>
    </div>
    </body></html>