Bulls and Cows

You are playing the following Bulls and Cows game with your friend: You write a 4-digit secret number and ask your friend to guess it. Each time your friend guesses a number, you give a hint. The hint tells your friend how many digits are in the correct positions (called "bulls") and how many digits are in the wrong positions (called "cows"). Your friend will use those hints to find out the secret number.

For example:

Secret number:  "1807"
Friend's guess: "7810"

Hint: 1 bull and 3 cows. (The bull is 8, the cows are 0, 1 and 7.)

Write a function to return a hint according to the secret number and friend's guess, use A to indicate the bulls and B to indicate the cows. In the above example, your function should return "1A3B".

Please note that both secret number and friend's guess may contain duplicate digits, for example:

Secret number:  "1123"
Friend's guess: "0111"

In this case, the 1st 1 in friend's guess is a bull, the 2nd or 3rd 1 is a cow, and your function should return "1A1B".

You may assume that the secret number and your friend's guess only contain digits, and their lengths are always equal.

  • guess中如果对应secret中的值位置也相等则A的值+1;
  • 如果guess中的值与secret中的值位置不同,但是secret中值存在,则B的值+1;
  • 注意,如果两个值已经在位置上也想等了,则B中不应该再认为是存在
    • 比如“010”和“211”返回应该是1A0B
char *itoa(int n)
{
    char *answer = NULL;    //要返回值给函数,必须用malloc
    int i = 1;
    int m = n;
    if (n < 10)
    {
        answer = (char *)malloc(i + 1);
        *answer = n + '0';
        answer[1] = 0;
        return answer;
    }
    else
    {
        while (n / 10 != 0)
        {
            i++;
            n /= 10;
        }
        answer = (char *)malloc(i + 1);
        *(answer + i) = 0;
        n = m;
        while (n != 0)
        {
            --i;
            answer[i] = n % 10 + '0';
            n /= 10;
        }
        return answer;
    }
}
char* getHint(char* secret, char* guess) {
    char *answer, *Aa, *Ba;
    int Alen = 0, Blen = 0;
    int A = 0, B = 0;
    int i = 0, j = 0;
    
    int size = strlen(secret);
    char *secret2 = malloc(size + 1);
    char *guess2 = malloc(size + 1);
    strcpy(secret2, secret);
    strcpy(guess2, guess);
    while (*(secret2 + i))
    {
        if (*(secret2 + i) == *(guess2 + i))
        {
            A++;
            *(secret2 + i) = 'x';
            *(guess2 + i) = 'x';
        }
        i++;
    }
    i = 0;
    while (*guess2)
    {
        if (*guess2 == 'x')
            guess2++;
        else
        {
            while (*(secret2 + i))
            {
                if (*(secret2 + i) == *guess2)
                {
                    B++;
                    *(secret2 + i) = 'x';
                    break;
                }
                else
                    i++;
            }
            i = 0;
            guess2++;
        }
        
    }
    Aa = itoa(A);    //因为A和B会大于10
    Ba = itoa(B);
    Alen = strlen(Aa);
    Blen = strlen(Ba);
    answer = (char *)malloc(strlen(Aa) + strlen(Ba) + 3);
    answer[Alen + Blen + 2] = 0;
    strcpy(answer, Aa);
    answer[Alen] = 'A';
    strcpy(answer + Alen + 1, Ba);
    answer[Alen + Blen + 1] = 'B';
    return answer;
}
  • 通过把已经确定相同的值标记为’x’,把secret上存在guess但是还没被检测过的也标记为‘x’;
  • 就因为A和B的值会大于10,另外又写了一个itoa的函数,用c++的map话应该会很快的
  • 先把题目看清楚了再开始做题

转载于:https://www.cnblogs.com/dylqt/p/4943719.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值