제안 된 대안 (의사 코드) :
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;
}
나는 이것이 그것을해야한다고 생각한다 : 우리는 현재 슬롯이 아닌 다른 슬롯, 완벽한 (검은 색) 일치가 아닌 슬롯을 확인하고 있으며, 이전에 흑인 또는 백인을 표시하는 데 사용되지 않았습니다.
-------------------Knuth는 The Computer as Master Mind 에서이 질문에 답 하고 정확하게 정의하기 어렵다는 것을 인정합니다. 그는 이것을 제안합니다 :
- 답변의 각 위치를 현재 추측의 동일한 위치와 비교하여 흑인의 수를 계산합니다.
- 아래와 같이 백인과 흑인의 수를 계산하십시오.
- 흰색의 수를 얻으려면 (2)에서 (1)을 빼십시오.
흰색과 검은 색을 계산하려면 :
- 두 개의 배열을 확인,
ans
및guess
각 색상의 슬롯. - 각 색상
ans
에 대해 답에서 해당 색상의 못 수로 채 웁니다 . 마찬가지로guess
현재 추측에서 해당 색상의 못 수로 채 웁니다 . - 추가 할
min(ans[i], guess[i])
각i
. 이것은 백인과 흑인입니다.
이 시도:
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;
}
}
-------------------Knuth가 흰색 및 검은 색 못의 수를 결정하는 4 단계 알고리즘을 제공했다는 설명이 4 단계에서 잘못되었습니다.
4 단계는 단순히 4-3 단계에서 반환 된 숫자를 반환합니다. 4 단계는 "누락"수를 반환합니다. 즉, 검은 색 또는 흰색 말뚝이 아닙니다.
3 단계를 사용하여 총 백인과 등의 수를 계산하십시오. 간단한 방법을 사용하여 검정 못의 수를 계산하십시오.
for i = 0 to 3:
if(a[i] == g[i]) b = b + 1
그리고 당연히 백인 = 3 단계-검정색 못의 수 (b).
출처
https://stackoverflow.com/questions/2005808