码迷,mamicode.com
首页 > 其他好文 > 详细

UVA340 UVALive5448 Master-Mind Hints

时间:2016-07-30 12:13:13      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

Regionals 1995 >> North America - North Central NA

问题链接:UVA340 UVALive5448 Master-Mind Hints基础训练题,用C语言编写程序。

题意:输入多组测试用例,每个用例第1个数为n,n=0时结束。后面有若干行,每行输入n个正整数(值范围为1到9),第1行是n个秘密数(需要猜测的数),第2行开始是猜测的n个数,若猜测的n个数全为0则结束进入下一个测试用例。

求的是,猜测的n个数有几个相同(位置和值与值都相同),有几个相关(值相同而位置不同)。

网上相同版本的使用暴力法的程序居多,大概出自一人之手。可是,编写程序是要用巧,哪能动不动就暴力。

另外,编写程序需要考虑通用性,使用宏定义是值得推荐的一种做法。

程序中,使用数组digitcount_s[]和digitcount_i[]来统计各种值出现的次数,这使得计算结果变得简单。

AC的C语言程序如下:

/* UVA340 UVALive5448 Master-Mind Hints */

#include <stdio.h>
#include <memory.h>

#define MIN(a, b)   (((a) > (b)) ? (b) : (a))

#define VALNUM 10

#define MAXN 1000

int secret[MAXN];
int guess[MAXN];

int main(void)
{
    int caseno=1, n, i;
    int strong, independent;
    int digitcount_s[VALNUM], digitcount_i[VALNUM];

    while(scanf("%d", &n) != EOF && n != 0) {
        printf( "Game %d:\n", caseno++ );

        memset(digitcount_s, 0, sizeof(digitcount_s));
        for(i=0; i<n; i++) {
            scanf( "%d", &secret[i] );

            digitcount_s[secret[i]]++;
        }

        for(;;) {
            int sum = 0;

            strong = 0;
            independent = 0;

            memset(digitcount_i, 0, sizeof(digitcount_i));

            for(i=0; i<n; i++) {
                scanf( "%d", &guess[i] );
                sum += guess[i];

                if(guess[i] == secret[i])
                    strong++;

                digitcount_i[guess[i]]++;
            }
            if(sum == 0)
                break;

            for(i=1; i<VALNUM; i++)
                independent += MIN(digitcount_s[i], digitcount_i[i]);

            printf("    (%d,%d)\n", strong, independent - strong);
        }
    }

    return 0;
}


UVA340 UVALive5448 Master-Mind Hints

标签:

原文地址:http://blog.csdn.net/tigerisland45/article/details/52048223

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!