珠玑妙算游戏

珠玑妙算游戏,OJ练习

  • 一、描述
  • 二、方法一
  • 三、方法二

一、描述

珠玑妙算游戏(the game of master mind)的玩法如下:
计算机有4个槽,每个槽放一个球,颜色可能是红色(R)、黄色(Y)、绿色(G)或蓝色(B)。例如,计算机可能有RGGB 4种(槽1为红色,槽2、3为绿色,槽4为蓝色)。作为用户,你试图猜出颜色组合。打个比方,你可能会猜YRGB。要是猜对某个槽的颜色,则算一次“猜中”;要是只猜对颜色但槽位猜错了,则算一次“伪猜中”。注意,“猜中”不能算入“伪猜中”,本题OJ链接
给定一种颜色组合solution和一个猜测guess,编写一个方法,返回猜中和伪猜中的次数answer,其中answer[0]为猜中的次数,answer[1]为伪猜中的次数。
示例1:
输入:solution=“RGBY”,guess=“GGRR”
输出:[1,1]
解释:猜中1次,伪猜中1次
示例2:
输入:solution=“BRBB”,guess=“RBGY”
输出:[0,2]
解释:猜中0次,伪猜中2次
示例3:solution=“BRGG”,guess=“BBRR”
输出:[1,1]
解释:猜中1次,伪猜中1次
提示:
len(solution) = len(guess) = 4
solution和guess仅包含"R",“G”,“B”,"Y"这4种字符

二、方法一

1、先计算猜中次数,统计solution和guess中相同下标相等的元素,并将相等的元素都赋值为0,最后统计相等的次数就是猜中的次数
2、再计算伪猜中次数(注意:如果solution[i]==guessj,则是伪猜中,后面的对比这两个位置都不能再用了)依次用数组guess中的非0元素和solution中的每个非0元素对比,统计相等的次数,并将相等的元素赋值为0,并且重新用下一个guess中的元素和solution中的每个非0元素对比,最后统计相等的次数就是伪猜中次数
代码实现:

int* masterMind(char* solution, char* guess, int* returnSize)
{
    int* returnArr = (int*)calloc(2, sizeof(int));
    *returnSize = 2;
    int i = 0;
    for(i = 0; i < 4; i++) //计算猜中
    {
        if(solution[i] == guess[i])
        {
            returnArr[0]++;
            solution[i] = guess[i] = 0;
        }
    }
    int j = 0;
    for(i = 0; i < 4; i++) //计算伪猜中
    {
        if(guess[i] != 0)
        {
            for(j = 0; j < 4; j++)
            {
                if(solution[j] != 0 && solution[j] == guess[i])
                {
                    returnArr[1]++;
                    solution[j] = 0;
                    break;
                }
            }
        }
    }
    return returnArr;
}

三、方法二

猜中次数:若位置相同且颜色字符也相同,则猜中次数计数器+1
伪猜中次数:颜色相同,但是在不同位置,这时候只需要除去猜中位置之外,统计两个数组中各个字符出现的数量,取较小的一方就是每种颜色伪猜中的数量了。

int* masterMind(char* solution, char* guess, int* returnSize)
{
    int* returnArr = (int*)calloc(2, sizeof(int)); //开辟返回数组
    int* flagSolution = (int*)calloc(26, sizeof(int)); //统计solution中颜色字符数量的数组,flagSolution['G'-'A']表示颜色G出现的次数
    int* flagGuess = (int*)calloc(26, sizeof(int)); //统计guess中颜色字符数量的数组,flagGuess['G'-'A']表示颜色G出现的次数
    *returnSize = 2;
    int i = 0;
    for(i = 0; i < 4; i++) //因为只有四个字符,所有循环4次
    {
        if(solution[i] == guess[i]) //猜中了,猜中次数增加
        {
            returnArr[0]++;
        }
        else
        {
            flagSolution[solution[i] - 'A'] += 1;
            flagGuess[guess[i] - 'A'] += 1;
        }
    }
    for(i = 0; i < 26; i++) //处理统计数量的数组,取对应颜色字符数量的较小值
    {
        returnArr[1] += flagSolution[i] < flagGuess[i] ? flagSolution[i] : flagGuess[i];
    }
    return returnArr;
}

你可能感兴趣的:(OJ,算法,leetcode)