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话应该会很快的
  • 先把题目看清楚了再开始做题
posted @ 2015-11-06 21:38  dylqt  阅读(194)  评论(0编辑  收藏  举报