0

誰かが私を助けてくれるかどうか疑問に思っています。私は、コンピューターがランダムな4桁のコードを生成するゲームを持っています。各桁は0から5の範囲です。次に、ユーザーはこのコードを推測し、コンピューターは文字列に出力する配列を返します。配列には、正しい場所にある正しい数字である推測のすべての数字に6、正しい数字であるが間違った場所にある推測の各数字に7、最後に完全に間違った数字に5が含まれている必要があります。

たとえば、コードが0143
で、ユーザーの推測が0451
の場合、配列は6775である必要があります。

これは、0が完全に正しく、1と4がコードに含まれているが、間違った場所で推測され、5が完全に正しくないためです。また、各桁は配列の別々の部分にあります。

これは私がこれまでに持っているものです:

for (int i = 0; i < 4; i++) { 
    if (combo[i] == guess[i]) { 
        Pegs[peg] = 6; 
        peg++; 
    } 
} 

for (int i = 0; i < 4; i++) { 
    for (int x = 0; x < 4; x++) { 
        if (guess[i] == combo[x] && guess[i] != combo[i]) { 
            Pegs[peg] = 7; 
            peg++; 
        } 
    } 
} 

for (int i = 0; i < 4; i++) { 
    if (Pegs[i] == 0) { 
        Pegs[i] = 5; 
    } 
} 

配列guessはユーザーの推測を格納し、配列コンボは正しいコードであり、Pegs []は比較された配列が格納される場所であり、intpegは値を配列のどこに格納するかを示します。これに伴う問題は、配列が常に正しく実行に戻るとは限らないことです。

4

2 に答える 2

2

配列を比較するには、最初のループのみが必要であり、同じ位置にある数が等しくない場合にのみ、内側のループを実行する必要があります。

for(int i = 0; i < 4; i++) {
    Pegs[i]=5;
    if(combo[i] == guess[i]) {
        Pegs[i] = 6;
        guess[i]= -1;
    }
}

for(int i = 0; i < 4; i++) {
    for (int j = 0; j < 4; j++) {
        if(combo[i] == guess[j]) {
            Pegs[i]=7;
            guess[j]= -1;
            break;
        }
    }
}
...
于 2013-01-06T00:57:18.417 に答える
2

他の方法では、次のようなシナリオがあると問題が発生します

int[] combot = new int[] {0, 1, 1, 3};
int[] guess  = new int[] {0, 4, 5, 1};

最後の推測を2倍に数えるので[6, 7, 7, 5]、正しいのではなく間違った結果が得られるためです。[6, 7, 5, 5]1

を使用して2つのフラグ配列。1つは完全一致用、もう1つは誤った推測用です。単一のフラグ配列を使用すると、はるかに優れた正確な結果を得ることができます。

**編集済み**とについて、間違った応答を返していたことがわかったためcombo = [0, 1, 1, 3]、元に戻しました。guess = [3, 0, 1, 5]

public int[] computeGuess(int[] combo, int[] guess) {
    int[] result = new int[4];

    Arrays.fill(result, 5);  // incorrect values for all!

    boolean[] exactMatches = new boolean[4];  // all initially set to false
    boolean[] misplaced    = new boolean[4];

    for (int i = 0; i < 4; i++) {
        if (combo[i] == guess[i]) {
            exactMatches[i] = true;
            misplaced[i] = false;  // make sure we don't use this as misplaced
        } else {
            for (int j = 0; j < 4; j++) {
                if (i != j && combo[i] == guess[j] && !exactMatches[j] && !misplaced[j]) {
                    misplaced[j] = true;
                    break;
                }
            }   
        }
    }

    int i = 0;
    for (boolean b : exactMatches) {
        if (b) {
            result[i++] = 6;
        }
    }
    for (boolean b : misplaced) {
        if (b) {
            result[i++] = 7;
        }
    }

    return result;
}
于 2013-01-06T01:30:55.577 に答える