注册 登录
编程论坛 数据结构与算法

实在想不通,大家帮忙看看,急

世界模型 发布于 2011-03-18 23:26, 885 次点击
有12个铁球,目前知道里面有一只球的重量与其它的不同,要求只用3次比较找出该球。注意,该球究竟是比其他球重还是轻是未知的。
请编程序实现该问题。
17 回复
#2
ansic2011-03-19 09:11
楼主的问题跟这个差不多。 参考一下吧。
https://bbs.bccn.net/viewthread.php?tid=333089&page=1#pid1919571
#3
诸葛修勤2011-03-19 10:13
哪儿的题?
#4
诸葛修勤2011-03-19 10:16
3.25次
#5
世界模型2011-03-19 11:51
我们老大给我们出的测试题
#6
卧龙孔明2011-03-19 12:00
dp.
#7
诸葛修勤2011-03-19 12:16
回复 6楼 卧龙孔明
什么意思啊
#8
诸葛修勤2011-03-20 11:04
程序代码:
/*

 *有12个铁球,目前知道里面有一只球的重量与其它的不同,要求只用3次比较找出该球。

 *注意,该球究竟是比其他球重还是轻是未知的。请编程序实现该问题。

 
*/
#include <stdio.h>

#define    LENGTH    12//数组的长度

int test[LENGTH+1] = {0};

int Compare_to_two(int unkown_x, int unkown_y, int standard_z);
int Compare_array(int dim_x, int dim_y, int num);
void Find_error();
bool Check_array();
void Get_input();
void Show_different_ball( int unkown_x, int unkown_y, int standard_z);

int main()
{
    bool flag = false;

    while ( !flag )
    {
        Get_input();
        flag = Check_array();
    }

    Find_error();

    return 0;
}
/*

 *从控制台输入12个数

 
*/
void Get_input()
{
    int i = 1;
    printf("\t从控制台输入11个相同的数和1个不同的数以空格隔开\n");
    while( LENGTH+1 != i )
    {
        scanf("%d", test+i);
        ++i;
    }

    return;
}
/*

 *检查输入是否合格 合格则返回true 否则false

 
*/
bool Check_array()
{
    int i = 2, same_count = 0, different_count = 0;
    while ( LENGTH+1 != i )
    {
        if( test[1] == test[i] )
        {
            ++same_count;
        }
        else
        {
            ++different_count;
        }
        ++i;
    }
    if( (10 == same_count && 1 == different_count) || (0 == same_count && 11 == different_count) )
    {
        return true;
    }
    return false;
}

/*

 *从12个球中查找有问题的那个并取出来

 
*/
void Find_error()
{
    //{1,2,3,4}{5,6,7,8}{9,10,11,12}
    int result = Compare_array( 1, 5, 4 );
    int sub_result;
    int sum_1 = test[1] + test[6] + test[7];
    int sum_2 = test[2] + test[8] + test[9];

    if( 0 == result )
    {//表示{1,2,3,4}=={5,6,7,8} 问题存在于{9,10,11,12}
        sub_result = Compare_to_two( 9, 10, 1 );
        if( 0 == sub_result )
        {//问题在 11 12 中
            Show_different_ball( 11, 12, 1 );
        }
        else//( -1 == sub_result )
        {//问题在9 10 中
            Show_different_ball( 9, 10, 1 );
        }
        return;
    }
    else if( -1 == result )
    {//表示{9,10,11,12} 是标准的 问题在比较的两组当中的一组中
        
//{1,2,3,4}        {5,6,7,8}把3,4,5拿掉
        
//{1,2}    {6,7,8}        2和6,7调换
        
//{1, 6, 7} {2, 8} 把9放进去
        
//{1, 6, 7} {2, 8, 9}
        if( sum_1 == sum_2 )
        {//问题在于 3 4 5
            if( test[3] == test[4] )
            {//5不同
                printf("\t第5号球与其他不同\n");
            }
            else if( test[3] > test[4] )
            {
                printf("\t第3号球与其他不同\n");
            }
            else
            {
                printf("\t第4号球与其他不同\n");
            }
            return;
        }
        else if( sum_1 < sum_2 )
        {//问题在于交换的那些中2, 6, 7
            if( test[6] == test[7] )
            {
                printf("\t第2号球与其他不同\n");
            }
            else if( test[6] > test[7] )
            {
                printf("\t第7号球与其他不同\n");
            }
            else
            {
                printf("\t第6号球与其他不同\n");
            }
        }
        else
        {//问题在1, 8
            if( test[1] == test[9] )
            {
                printf("\t第8号球与其他不同\n");
            }
            else
            {
                printf("\t第1号球与其他不同\n");
            }
        }

    }
    else
    {//表示{9,10,11,12} 是标准的 问题在比较的两组当中的一组中
        if( sum_1 == sum_2 )
        {//问题在于 3 4 5
            if( test[3] == test[4] )
            {//5不同
                printf("\t第5号球与其他不同\n");
            }
            else if( test[3] < test[4] )
            {
                printf("\t第3号球与其他不同\n");
            }
            else
            {
                printf("\t第4号球与其他不同\n");
            }
            return;
        }
        else if( sum_1 < sum_2 )
        {//问题在1, 8
            if( test[1] == test[9] )
            {
                printf("\t第8号球与其他不同\n");
            }
            else
            {
                printf("\t第1号球与其他不同\n");
            }
        }
        else
        {//问题在于交换的那些中2, 6, 7
            if( test[6] == test[7] )
            {
                printf("\t第2号球与其他不同\n");
            }
            else if( test[6] < test[7] )
            {
                printf("\t第7号球与其他不同\n");
            }
            else
            {
                printf("\t第6号球与其他不同\n");
            }
        }

    }
    return;
}
/*

 *比较两个数组的大小 相等返回 0, 左边的大 -1, 右边的大1

 
*/
int Compare_array(int dim_x, int dim_y, int num)
{
    int sum_x = 0;//存放总值dim_x
    int sum_y = 0;//存放总值dim_y
    int index = 0;
    while( num != index )
    {
        sum_x += test[dim_x + index];
        ++index;
    }
    index = 0;
    while( num != index )
    {
        sum_y += test[dim_y + index];
        ++index;
    }

    if( sum_x == sum_y )
    {
        return 0;
    }
    else if( sum_x > sum_y )
    {
        return -1;
    }
    else
    {
        return 1;
    }   
}
/*

 *两个球未知球  和 两个标准求相比较

 *相等返回0 未知重返回-1 标准重返回1

 
*/
int Compare_to_two(int unkown_x, int unkown_y, int standard_z)
{
    int xy = test[unkown_x] + test[unkown_y];
    if( xy == 2*standard_z )
    {
        return 0;
    }
    else if( xy > 2*standard_z )
    {
        return -1;
    }
    else
    {
        return 1;
    }
}
/*

 *输出两个球中 有问题的那个球出来

 
*/
void Show_different_ball( int unkown_x, int unkown_y, int standard_z)
{
    if( test[unkown_x] == test[standard_z] )
    {
        printf("\t第%d号球与其他不同\n", unkown_y);
        return;
    }
    else
    {
        printf("\t第%d号球与其他不同\n", unkown_x);
        return;
    }
}
#9
世界模型2011-03-20 18:44
貌似10号球之后有问题的球都会显示是:第10号球有问题
#10
诸葛修勤2011-03-20 21:20
回复 9楼 世界模型
你截个图看下  我这里没有你说的情况
#11
世界模型2011-03-20 21:28
只有本站会员才能查看附件,请 登录
#12
世界模型2011-03-20 21:29
只有本站会员才能查看附件,请 登录
#13
世界模型2011-03-20 21:30
不是应该11号与别的不同么
#14
诸葛修勤2011-03-20 21:43
回复 13楼 世界模型
帅哥 你厉害
不要 用零试下  
把零改成1  把一改成2把
#15
诸葛修勤2011-03-20 21:56
程序代码:
/*
*两个球未知球  和 两个标准求相比较
*相等返回0 未知重返回-1 标准重返回1
*/
int Compare_to_two(int unkown_x, int unkown_y, int standard_z)
{
    int xy = test[unkown_x] + test[unkown_y];
    if( xy == 2*test[standard_z] )
    {
        return 0;
    }
    else if( xy > 2*test[standard_z] )
    {
        return -1;
    }
    else
    {
        return 1;
    }
}
#16
诸葛修勤2011-03-20 21:57
/*
*两个球未知球  和 两个标准求相比较
*相等返回0 未知重返回-1 标准重返回1
*/
int Compare_to_two(int unkown_x, int unkown_y, int standard_z)
{
    int xy = test[unkown_x] + test[unkown_y];
    if( xy == 2*test[standard_z] )
    {
        return 0;
    }
    else if( xy > 2*test[standard_z] )
    {
        return -1;
    }
    else
    {
        return 1;
    }
}
#17
世界模型2011-03-20 22:44
好吧,我错了,呵呵
谢谢了!
#18
诸葛修勤2011-03-21 07:34
回复 17楼 世界模型
是我的程序 写错了   你测试的数据没有问题
1