小时候挺喜欢玩24的游戏,看到这道题也特别有感情,所以,就拿它来写写吧。
中间还有个小插曲,自己写完后,就拿数据进行测试,测试过程中,就然被一组随机数据给难倒了,呵呵,程序给出可以计算出来,可是我那着笔算了下,没算出来,所以又回到程序看看程序怎么算出来的,哈哈:这组数据是:5,5,2,10,有兴趣的人先算算看,怎样得到24,然后再接着看吧。
- 编程语言要求:
- 240分钟
- C C++ C#
“24点游戏是一种使用扑克牌来进行的益智类游戏,游戏内容是:从一副扑克牌中抽去大小王剩下52张,任意抽取4张牌,把牌面上的数(A代表1)运用加、减、乘、除和括号进行运算得出24。每张牌都必须使用一次,但不能重复使用。
有些组合有不同种算法,例如要用2,4,6,12四张牌组合成24点,可以有如下几种组合方法:
- 2 + 4 + 6 + 12 = 24
- 4 × 6 ÷ 2 + 12 = 24
- 12 ÷ 4 × (6 + 2) = 24
当然,也有些组合算不出24,如1、1、1、1 和 6、7、8、8等组合。”
--题目描述来自wikipedia:http://zh.wikipedia.org/wiki/24%E7%82%B9。
请完成函数can24,4张牌如果可以组成24点,返回1,不能则返回0。
友情提醒:
注意以下这些组合:
1 1 1 10 不可以;
6 6 6 6 可以;
5 5 5 1 可以,即可以用分数,如(5-1/5)*5 = 24;
1 1 1 11 可以;
如果你还是不咋明白24点到底是怎么一回事,这里有一个可以在线计算24点的应用:http://www.zhongguosou.com/game_lookup_tools/game_24_point.html,可慢慢体会。
先说思路吧,其实算24也就是加减乘除四则运算,然后就是括号,其实要不要括号没关系,因为我们发现,计算一定是从两个数进行四则运算开始,然后得到的结果在和另外的数进行四则运算。直到全部计算完为止。
步骤:
1、首先从4个数里面,选择两个数,进行四则运算,将结果返回。
2、这样就只剩3个数了,重复步骤一,直到最后一个数,看看这个数是否==24,相等,就找到了。
思路非常简单,代码也非常简单:
函数一:计算两个数的四则运算结果
/// <summary>
/// 两个数操作得出的结果集
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public static float[] cal(float a,float b)
{
float[] result;
if (a == 0||b==0)
{
if (a == 0 && b == 0)
{
result = new float[1];
result[0] = 0;
}
else
{
if (a == 0)
{
result = new float[3];
result[0] = b;
result[1] = 0 - b;
result[0] = 0;
}
else
{
result = new float[3];
result[0] = a;
result[1] = 0 -a;
result[0] = 0;
}
}
}
else
{
result = new float[6];
result[0] = a + b;
result[1] = a - b;
result[2] = a * b;
result[3] = a / b;
result[4] = b - a;
result[5] = b / a;
}
return result;
}
函数二:遍历给定的多个数进行四则运算
public static int cal(float[] cards)
{
int result = 0;
if (cards.Length == 2)
{
float[] array = cal(cards[0], cards[1]);
float tmp = 0;
for (int i = 0; i < array.Length; i++)
{
tmp = (float)Math.Floor(array[i] * 1000 + 0.1) / 1000;
if (tmp == 24)
{
result = 1;
break;
}
}
}
else
{
for (int i = 0; i < cards.Length - 1; i++)
{
for (int j = i + 1; j < cards.Length; j++)
{
float[] array = cal(cards[i], cards[j]);
float[] newdata = new float[cards.Length - 1];
int index = 0;
for (int k = 0; k < cards.Length; k++)
{
if (k != i && k != j)
{
newdata[index] = cards[k];
index++;
}
}
for (int k = 0; k < array.Length; k++)
{
newdata[newdata.Length - 1] = array[k];
result = cal(newdata);
if (result == 1)
{
break;
}
}
if (result == 1)
{
break;
}
}
if (result == 1)
{
break;
}
}
}
return result;
}
主函数调用:
float[] cards = new float[4];
cards[0] = a;
cards[1] = b;
cards[2] = c;
cards[3] = d;
return cal(cards);
ok,提交没有问题