| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5798 人关注过本帖, 5 人收藏
标题:12个球的程序.....
只看楼主 加入收藏
hao0716
Rank: 4
等 级:业余侠客
威 望:1
帖 子:353
专家分:222
注 册:2006-4-11
收藏(5)
 问题点数:0 回复次数:17 
12个球的程序.....
微软的一道题目...上班很无聊 写来玩玩
有12个外表一模一样的小球,其中有一个的质量和其他11个球不一样(11个球的质量完全相同),而且该球不知道是轻点还是重点。现在给你一个天平(无砝码),只有3次测量机会,请你找出该球。球号从a到l(小写)

程序代码:
#include <stdio.h>
#include<time.h>
#include<stdlib.h>

#define LETTER_HEAD 97      //a的起始
#define BALL_NUM 12         //球个数
#define NORMAL_WEIGHT 2     //一般球的重量
#define HIGH_WEIGHT 3       //球超重
#define LOW_WEIGHT 1        //球失重...
#define LOOP 3              //循环次数(可称几次)
#define FALSE -1        
#define TRUE 0

int badBallWeight;
char badBall;


//得到坏球的字符
char getBadBall()
{
    srand((unsigned)time(NULL));
    return (char)(random()%BALL_NUM+LETTER_HEAD);
}

//得到坏球的重量
void getBadBallWeight()
{
    int type;
    srand((unsigned)time(NULL));
    type = random()%2;
    
    if(1==type)
    {   
        badBallWeight = HIGH_WEIGHT;
    }
    else
    {
        badBallWeight = LOW_WEIGHT;
    }
}


//开启了debug后 返回FALSE 
int debug(char* str)
{
    if(strcmp(str, "exit") == 0)
    {
        exit(0);
    }

    if(strcmp(str, "cheat") == 0)
    {
        printf("CHEAT : bad ball is %c, weight is %d\n", badBall, badBallWeight);
        return FALSE;
    }

    return TRUE;
}

//验证球的名字,不在a-l之间的返回FALSE
int verifyBallsName(char* str)
{
    char* p;
    
    for(p = str; *p != '\0'; p++)
    {
        if(*p<'a' || *p>'l')
        {
            return FALSE;
        }
    }
    
    return TRUE;
}


//验证一侧的球有无重复,重复返回FALSE
int verifySingleRepeat(char* str)
{
    char* p, *temp;
    int repeat;
    
    for(p = str; *p != '\0'; p++)
    {
        repeat = 0;
        for(temp = str; *temp != '\0'; temp++)
        {
            if(*p == *temp)
                repeat++;   
            
        }
        
        if(repeat > 1)
            return FALSE;
    }
    
    return TRUE;
}

//验证一侧的错误性 有错打印并返回FALSE,无错返回有几个球
int verifySingle(char* str)
{
    int err;

    err = debug(str);
    if(FALSE == err)
        return FALSE;
    
    err = verifyBallsName(str);
    if(FALSE == err)
    {
        printf("\nERROR: balls name error (Usage:abcdefghijkl)\n");
        return FALSE;
    }
    
    err = verifySingleRepeat(str);
    if(FALSE == err)
    {
        printf("\nERROR: balls name repeat\n");
        return FALSE;
        
    }
    
    return TRUE;
}

//得到单侧的重量
int getSingleWeight(char* str)
{
    int ballsNum, haveBadBall;
    char* p;
    
    ballsNum = strlen(str);
    haveBadBall = 0;
    
    for(p = str; *p != '\0'; p++)
    {
        if(*p == badBall)   
            haveBadBall++; 
    }
    

    return ((ballsNum-haveBadBall)*NORMAL_WEIGHT+haveBadBall*badBallWeight);

}

int verifyMultiBallName(char* leftStr, char* rightStr)
{
    char *l, *r;
    
    for(l = leftStr; *l != '\0'; l++)
    {
        for(r = rightStr; *r != '\0'; r++)
        {
            if(*l == *r)
                return FALSE;
        }
    }
    
    return TRUE;
}


int main()
{
    int loopTime, err;
    int leftWeight, rightWeight;
    char left[128],right[128];
    char bad[16];
    
    printf("有12个外表一模一样的小球,其中有一个的质量和其他11个球不一样(11个球的质量完全相同),\
    而且该球不知道是轻点还是重点。现在给你一个天平(无砝码),只有3次测量机会,请你找出该球。球号从a到l(小写)\n");
    badBall = getBadBall();
    getBadBallWeight();
        
    for(loopTime = 1; loopTime <= LOOP; loopTime++)
    {
        printf("pls input left balls:   ");
        scanf("%s", left);    
        
        err = verifySingle(left);
        if(FALSE == err)
            goto error;
                
        leftWeight = getSingleWeight(left);
        
        printf("pls input right balls:   ");
        scanf("%s", right); 

        err = verifySingle(right);
        if(FALSE == err)
            goto error;
        
        rightWeight = getSingleWeight(right);
        
        err = verifyMultiBallName(left, right);
        if(FALSE == err)
        {
            printf("\nERROR: one ball both in left and right\n");
            goto error;
        }
        
        if(leftWeight > rightWeight)
        {
            printf("result %d : left > right\n", loopTime);
        }
        else if(leftWeight < rightWeight)
        {
            printf("result %d : left < right\n", loopTime);
        }
        else
        {
            printf("result %d : left = right\n", loopTime);
        }
        
        continue;
error:
        loopTime--;
    }
    
    printf("pls input the bad ball name:");
    
    scanf("%s", bad);
    if(*bad == badBall)
    {
        printf("\ncongratulation,your selected is right!\n");
    }
    else
    {
        printf("\nsorry,your selected is wrong!\n");
    }
    
    return 0;
}
搜索更多相关主题的帖子: 程序 
2008-04-21 13:42
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 
应该写个能让电脑给出答案的算法

从BFS(Breadth First Study)到DFS(Depth First Study)
2008-04-21 19:50
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
http://

楼主看看这个吧

" border="0" />[color=white]

[[it] 本帖最后由 雨中飛燕 于 2008-4-21 20:12 编辑 [/it]]
2008-04-21 20:11
churis
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-3-30
收藏
得分:0 
这个题目有难度
2008-04-22 00:39
精灵传说
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2008-3-25
收藏
得分:0 
应该是先称3个 再称2个 但程序不太好编 我去研究研究先

there is a castle on a cloud
2008-04-22 09:51
hao0716
Rank: 4
等 级:业余侠客
威 望:1
帖 子:353
专家分:222
注 册:2006-4-11
收藏
得分:0 
[bo]以下是引用 [un]永夜的极光[/un] 在 2008-4-21 19:50 的发言:[/bo]

应该写个能让电脑给出答案的算法


那个很容易作弊的,让别人给一个号,自己最后直接输出就好,哈哈。
其实网上有算法的 实现比较简单
燕子那个13个球的我就不想了...脑子比较秀逗 想不出算法.........

2008-04-22 10:19
wulang327
Rank: 1
来 自:大连
等 级:新手上路
帖 子:59
专家分:1
注 册:2008-1-29
收藏
得分:0 
我也试试
2008-04-22 20:27
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
很经典的一道题 顶一下
2008-04-22 20:53
yd4433
Rank: 1
等 级:新手上路
帖 子:404
专家分:0
注 册:2008-3-9
收藏
得分:0 
13qiu 问题 我也研究了一些时间  确实很经典

------...-.-..-...-----........-------.......----.....------....||- - !
2008-04-22 22:10
DoNO1
Rank: 1
等 级:新手上路
帖 子:155
专家分:0
注 册:2008-3-27
收藏
得分:0 
我见过一个简单点的题
总共有8个球,两次找出。哈哈
2008-04-23 08:45
快速回复:12个球的程序.....
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018471 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved