Как правильно подсчитать «белых» в догадках вдохновителя в c? - PullRequest
1 голос
/ 05 января 2010

«Белый» - это проверка правильности номера в неправильной позиции. Но я не знаю, как правильно считать.

#include "stdafx.h"
#include "stdlib.h" 
#include "time.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int answer[4];
    int guess[4];
    int count = 0;

    srand(time(NULL)); 
    /*answer[0] = (rand() % 6)+1;
    answer[1] = (rand() % 6)+1;
    answer[2] = (rand() % 6)+1;
    answer[3] = (rand() % 6)+1;*/

    answer[0] = 3;
    answer[1] = 3;
    answer[2] = 5;
    answer[3] = 2;

    printf("%d %d %d %d\n", answer[0],  answer[1],  answer[2],  answer[3]);
    printf("          B W\n"); 

    do
    {
        int black = 0;
        int white = 0;
        count++;
        printf("Enter 4 numbers, this is your %d guess: ", count);
        scanf("%d %d %d %d", &guess[0], &guess[1], &guess[2], &guess[3]);
        printf("\n%d %d %d %d\n", guess[0], guess[1], guess[2], guess[3]);

        int g2[2][6];

        for (int a = 0;a < 4;a++)
            g2[0][a]=answer[a];

        for (int i = 0;i < 4;i++)
            g2[1][i]=guess[i];

        if (answer[0]==guess[0])
            black++;
        if (answer[1]==guess[1])
            black++;
        if (answer[2]==guess[2])
            black++;
        if (answer[3]==guess[3])
            black++;

        if (answer[1]==guess[0] || answer[2]==guess[0] || answer[3]==guess[0])
            white++;
        if (answer[0]==guess[1] || answer[2]==guess[1] || answer[3]==guess[1])
            white++;
        if (answer[0]==guess[2] || answer[1]==guess[2] || answer[3]==guess[2])
            white++;
        if (answer[0]==guess[3] || answer[1]==guess[3] || answer[2]==guess[3])
            white++;

        if (black==4)
            white=0;

        g2[1][4]=black;
        g2[1][5]=white;

        for (int n = 0;n < 6;n++)
            printf(" %d",g2[1][n]); 

        printf("\n");
    }
    while (answer[0]!=guess[0] || answer[1]!=guess[1] ||
           answer[2]!=guess[2] || answer[3]!=guess[3]);

    printf("BINGO!!!\n");

    return 0;
}

Обновление 2:

for (int slot=0;slot<4;slot++)
{
    if (guess[slot] == answer[slot]) 
        black++;
    else 
        for (int s=0;s<4;s++)
            if (s != slot) 
            {
                if (guess[slot] == answer[s]) 
                    white++;
                break;
            }
}

Обновление 3:

for (int x=0;x<4;x++)
flag[x]=0;

for (int slot = 0;slot < 4;slot++) 
{ 
    if (guess[slot] == answer[slot])  
        if (flag[slot]==1)
            black++; 
    else  
        for (int s=0;s < 4;s++) 
            if (s != slot)  
            { 
                if (guess[slot] == answer[s])
                    if (flag[s]==1)
                    {
                        white++; 
                        break; 
                    }
            } 
} 

Обновление 4

for (int x=0;x<4;x++)
flag[x]=0;

for (int slot = 0;slot < 4;slot++) 
{ 
    if (guess[slot] == answer[slot])  {
        black++; 
        flag[slot]=1;
    }
else  
    for (int s=0;s < 4;s++)
        if (s != slot)
        { 
            if (guess[slot] == answer[s])  
            {
                white++; 
                flag[s]=1;
                break; 
            }
        } 
} 

Обновление 5:

#include "stdafx.h"
#include "stdlib.h" 
#include "time.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int answer[4];
    int guess[4];
    int flag[4];
    int count = 0;

    srand(time(NULL)); 
    /*answer[0] = (rand() % 6)+1;
    answer[1] = (rand() % 6)+1;
    answer[2] = (rand() % 6)+1;
    answer[3] = (rand() % 6)+1;*/

    answer[0] = 1;
    answer[1] = 2;
    answer[2] = 3;
    answer[3] = 4;

    printf("%d %d %d %d\n", answer[0],  answer[1],  answer[2],  answer[3]); 

    do
    {
        int black = 0;
        int white = 0;
        count++;
        printf("Enter 4 numbers, this is your %d guess: ", count);
        scanf("%d %d %d %d", &guess[0], &guess[1], &guess[2], &guess[3]);

        int g2[2][6];

        for (int a = 0;a < 4;a++)
            g2[0][a]=answer[a];

        for (int i = 0;i < 4;i++)
            g2[1][i]=guess[i];

        for (int x=0;x<4;x++)
            flag[x]=0;

        for (int slot = 0;slot < 4;slot++) 
        { 
            if (guess[slot] == answer[slot])  
                black++; 
            else   
                for (int s=0;s < 4;s++)  
                    if (s != slot && guess[slot] == answer[s] && !flag[s]) 
                    {  
                        white++;  
                        flag[s]=1; 
                        break;  
                    }
        } 

        g2[1][4]=black;
        g2[1][5]=white;

        printf("Guess %d: ", count);

        for (int n = 0;n < 4;n++){
            printf(" %d",g2[1][n]);
        }

        printf(" Black: %d White: %d\n", g2[1][4], g2[1][5]);
        printf("\n");
    }
    while (answer[0]!=guess[0] || answer[1]!=guess[1] ||
           answer[2]!=guess[2] || answer[3]!=guess[3]);

    printf("BINGO!!!\n");

    return 0;
}

Ответы [ 4 ]

9 голосов
/ 05 января 2010

Кнут отвечает на это в Компьютер как Мастер Разума и признает, что его трудно определить точно. Он предлагает это:

  1. Рассчитайте количество черных, сравнивая каждую позицию в ответе с той же позицией в текущем предположении.
  2. Рассчитайте количество белых и черных, как показано ниже.
  3. Вычтите (1) из (2), чтобы получить количество белых.

Для подсчета белых и черных:

  1. Создайте два массива, ans и guess, с прорезью для каждого цвета.
  2. Для каждого цвета заполните ans количеством колышков этого цвета в ответе. Аналогично, заполните guess количеством колышков этого цвета в текущем предположении.
  3. Суммируйте min(ans[i], guess[i]) за каждый i. Это белые плюс черные.
1 голос
/ 01 декабря 2013

Комментарий, в котором говорится, что Кнут предоставил 4-х шаговый алгоритм для определения неверно количество белых и черных колышков на шаге 4.

Шаг 4 просто возвращает 4 - число, возвращаемое на шаге 3. Шаг 4 возвращает количество «промахов», то есть не черный или белый колышек.

Просто используйте шаг 3, чтобы рассчитать количество белых и спинок в целом; рассчитать количество черных колышков с помощью простого

for i = 0 to 3:
   if(a[i] == g[i]) b = b + 1 

Тогда, конечно, белые = шаг 3 - количество черных колышков (б).

1 голос
/ 28 февраля 2010

Попробуйте это:

    for (int x=0;x<4;x++)
        flag[x]=guess[x]==answer[x]?1:0;

    for (int slot = 0;slot < 4;slot++) 
    { 
        if (guess[slot] == answer[slot])  
            black++; 
        else   
            for (int s=0;s < 4;s++)  
                if (!flag[s] && guess[slot] == answer[s]) 
                {  
                    white++;  
                    flag[s]=1; 
                    break;  
                }
    } 
1 голос
/ 05 января 2010

Предлагаемая альтернатива (псевдокод):

white = 0;
black = 0;
for slot=0 to 3
  if guess[slot] == answer[slot]
    black++
  else
    for s=0 to 3
      if s != slot
        if guess[slot] == answer[s]
          white++
          break

Обновление (подробно)

 else  
    for (int s=0;s < 4;s++) 
      if (s != slot && guess[slot] == answer[s] && !flag[s])
      { 
          white++; 
          flag[s]=1;
           break; 
      }

Я думаю, что это должно сработать: мы проверяем другой слот, который не является текущим, тот, который не является идеальным (черным) совпадением, и который раньше не использовался для пометки черного или белого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...