c语言的问题,比较复杂。。。请大大帮忙~~~好的加分!

一共有3个盒子,每个盒子里放了6个正好盒子大小的球,也就是说,每个盒子必须按照顺序取出,比如1号盒子的第1个球不拿出来,那么第2个球就拿不出来,但2号盒子的的第1个球可以拿。每个球的质量各不相同
分别设为 1号盒子 m11 m12 m13 m14 m15
2号盒子 m21 m22 m23 m24 m25
3号盒子 m31 m32 m33 m34 m35
然后1次取3个球(当然要按顺序取),在所有取法中,选择 3个球的质量相乘最小的 取法,拿出这种取法的第1个取的球,另2个放回原位。解释可能不到位,下面举一个例子。
比如 第一次一共有以下10种取法 (m11,m12,m13),(m11,m12,m21),(m11,m12,m31),(m11,m21,m31),(m11,m21,m22),(m11,31,m32),(m21,m22,m23),(m21,m22,m31),(m21,m31,m32),(m31,m32,m33) 然后选择括号里的值相乘最小的那组,比如(m11,m12,m13),然后拿出m11球,m12和m13放回原位,这样第一次取球就结束了。然后开始第二次,也有以下十种取法(m12,m13,m14),(m12,m13,m21),(m12,m13,m31),(m12,m21,m31),(m12,m21,m22),(m12,31,m32),(m21,m22,m23),(m21,m22,m31),(m21,m31,m32),(m31,m32,m33) 然后和第一次一样,选择相乘最小的那组,取出第一个球……
按照这样的取法,求18个球的取出顺序,要求用c语言做,小弟弄了好几天了,没弄出,求各位大大帮忙啊!!!最好能加上解释,感激不尽!!
1号盒子 m11 m12 m13 m14 m15 m16
2号盒子 m21 m22 m23 m24 m25 m26
3号盒子 m31 m32 m33 m34 m35 m36

这个应该可以好理解点吧
#include <stdio.h>
float m[3][6] = {{6.09, 6.18, 6.27, 6.17, 6.30, 6.24},
{6.11, 6.13, 6.22, 6.20, 6.26, 6.21},
{6.09, 6.25, 6.15, 6.14, 6.23, 6.12}};

void main()
{
int i;
int j = 0;
int m0Beg = 0;
int m1Beg = 0;
int m2Beg = 0;
float res[10];

while (j != 16)
{
if (m0Beg < 4 && m1Beg < 6 && m2Beg < 6)
{
res[0] = m[0][m0Beg] * m[0][m0Beg + 1] * m[0][m0Beg + 2];
}
else
{
res[0] = 8.0 * 8.0 * 8.0;
}
if (m1Beg < 4 && m0Beg < 6 && m2Beg < 6)
{
res[6] = m[1][m1Beg] * m[1][m1Beg + 1] * m[1][m1Beg + 2];
}
else
{
res[6] = 8.0 * 8.0 * 8.0;
}
if (m2Beg < 4 && m0Beg < 6 && m1Beg < 6)
{
res[9] = m[2][m2Beg] * m[2][m2Beg + 1] * m[2][m2Beg + 2];
}
else
{
res[9] = 8.0 * 8.0 * 8.0;
}
if (m0Beg < 5 && m1Beg < 6 && m2Beg < 6)
{
res[1] = m[0][m0Beg] * m[0][m0Beg + 1] * m[1][m1Beg];
res[2] = m[0][m0Beg] * m[0][m0Beg + 1] * m[2][m2Beg];
}
else
{
res[1] = 8.0 * 8.0 * 8.0;
res[2] = 8.0 * 8.0 * 8.0;
}
if (m1Beg < 5 && m0Beg < 6 && m2Beg < 6)
{
res[3] = m[0][m0Beg] * m[1][m1Beg] * m[1][m1Beg + 1];
res[7] = m[1][m1Beg] * m[1][m1Beg + 1] * m[2][m2Beg];
}
else
{
res[3] = 8.0 * 8.0 * 8.0;
res[7] = 8.0 * 8.0 * 8.0;
}
if (m2Beg < 5 && m0Beg < 6 && m1Beg < 6)
{
res[5] = m[0][m0Beg] * m[2][m2Beg] * m[2][m2Beg + 1];
res[8] = m[1][m1Beg] * m[2][m2Beg] * m[2][m2Beg + 1];
}
else
{
res[5] = 8.0 * 8.0 * 8.0;
res[8] = 8.0 * 8.0 * 8.0;
}
if (m0Beg < 6 && m1Beg < 6 && m2Beg < 6)
{
res[4] = m[0][m0Beg] * m[1][m1Beg] * m[2][m2Beg];
}
else
{
res[4] = 8.0 * 8.0 * 8.0;
}
float temp = res[0];
int pos = 0;
for (i = 1; i <= 9; ++i)
{
if (temp > res[i])
{
temp = res[i];
pos = i;
}
}
if (pos <= 5)
{
printf("取出m[0][%d]:%f\n", m0Beg, m[0][m0Beg]);
m0Beg++;
}
if (pos > 5 && pos <= 8)
{
printf("取出m[1][%d]:%f\n", m1Beg, m[1][m1Beg]);
m1Beg++;
}
if (pos == 9)
{
printf("取出m[2][%d]:%f\n", m2Beg, m[2][m2Beg]);
m2Beg++;
}
j++;
}
if (m0Beg == 7)
{
printf("取出m[1][%d]:%f\n", m1Beg, m[1][m1Beg]);
printf("取出m[2][%d]:%f\n", m2Beg, m[2][m2Beg]);
}
else if (m1Beg == 7)
{
printf("取出m[0][%d]:%f\n", m0Beg, m[0][m0Beg]);
printf("取出m[2][%d]:%f\n", m2Beg, m[2][m2Beg]);
}
else if (m2Beg == 7)
{
printf("取出m[0][%d]:%f\n", m0Beg, m[0][m0Beg]);
printf("取出m[1][%d]:%f\n", m1Beg, m[1][m1Beg]);
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-18
用栈来做。建立3个栈。因为每个盒子后2个取不到。所以只用建立3个有3个球的栈。
for(i = 0; i<3 ; i++)
{
a = pop(A);
for(j = 0; j < 3-i; j++)
{
b = pop(B);
for(k = 0; k < 3 - i - j; k++)
{
c = pop(C);
store(a*b*c);
}
}
}
选出所有组合追问

能有解释嘛,我c语言只学过基础的

第2个回答  2011-10-18
1、可以使用对堆栈的操作来完成,取球的思路和堆栈的push和pop是象温和的,可以使用堆栈
2、大体思路:先对三个栈进行初始化,分别得到栈顶指针,然后把栈内元素输出到一个二维数(3,n)组中,对二维数组中的行进行乘积运算,得到最小的值,记录栈指针:(分两种情况)(1)最小球的指针是栈顶元素,输出;(2)不是栈顶指针,查找是栈顶指针的最小乘积
3、找到后,栈内元素pop,其他元素push
4、循环完成,直到所有元素输出完成
第3个回答  2011-10-18
这个题最好用链表做,可能会方便一点:

基本思路:
通过for循环分别从三个链表中取出第一到第三个数,当三个数的下标之和等于3的时候,计算三个数的积,存入一个变量s中,并用一个数组o[3]分别记录三个数的下标,如果下一个数比这个数小,那么更新s和o[3],一次循环结束,输出o[1]的值,同时,更新被取出数的链表,将头结点删除,然后重复上面的过程,直到所有链表都为空。
第4个回答  2011-10-18
看了头晕,最关键的算法,那个语句也非常多,要组合,还要比较。。。
看了就晕,写语句更晕。
不过你可以先比较,3个最小的乘一定是最小的。然后写会来他们三想乘,剩下的,再放入,上面的变量中
第5个回答  2011-10-18
“选择 3个球的质量相乘最小的 取法”

你有毛病啊?不告诉重量 鬼知道哪种选择是质量相乘最小的 取法追问

我只求步骤,不求最后答案,因为原题要比这个复杂的多,盒子数,球数都比这个多,还是一次取5个,舍4个球的问题,所以这只是个简单的模型

相似回答