あなたHashSet
アプローチのかなりよさそうだが、少し調整が必要となります...
仮定がある:ときに最初のブロック重複が無く、すべてのブロックの同じ位置が重複していない場合でも、スドクは解決されます。
外部ループでは、最初のブロックの値だけをトラフする必要があります。
あなたは、独自の「チェックセット」との内部ループにより、全てのブロックが同じ位置に別の番号を持っていることを、「最初のブロックチェックセット」に現在の値を追加し、チェックする必要があります:
First iteration
1## 2## 3##
### ### ###
### ### ###
4## 5## 5##
### ### ###
### ### ###
7## 8## 9##
### ### ###
### ### ###
firstBlock: [1]
second iteration
#2# #3# #4#
### ### ###
### ### ###
#5# #6# #7#
### ### ###
### ### ###
#8# #9# #1#
### ### ###
### ### ###
firstBlock: [1,2]
大きなトリックは、x
とy
座標のループを避けることです。
Javaは私が座標を決定するためにオブジェクトを使用することをお勧めオブジェクト指向プログラミング言語ですので。私たちは配列でそれらを保持することができます(ブックマークを設定、私は通常、代わりに "コレクション"と言う...)と単純なforechループでそれを繰り返す...
また、私たちはいくつかのオブジェクト私はうまくいけばの有用性を実証し
public class SudokuCheck {
enum SudokuPosition {
p11(0, 0), p12(0, 1), p13(0, 2),
p21(1, 0), p22(1, 1), p23(1, 2),
p31(2, 0), p32(2, 1), p33(2, 2);
private final int x;
private final int y;
SudokuPosition(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {return x;}
public int getY() {return y;}
}
boolean check(int[][] sudoku) {
Set<Integer> firstBlockUniqueNumbers = new HashSet<>();
for (SudokuPosition inBlock : SudokuPosition.values()) {
firstBlockUniqueNumbers.add(sudoku[inBlock.x][inBlock.y]);
Set<Integer> samePosInOtherBlocksUniqueNumbers = new HashSet<>();
for (SudokuPosition ofBlock : SudokuPosition.values()) {
int sameXinAll = inBlock.x + offset(ofBlock.x);
int sameYinAll = inBlock.y + offset(ofBlock.y);
samePosInOtherBlocksUniqueNumbers.add(sudoku[sameXinAll][sameYinAll]);
}
if (9 > samePosInOtherBlocksUniqueNumbers.size())
// numbers where not unique at current block position
// through all the blocks
return false;
}
return 9 == firstBlockUniqueNumbers.size();
}
private int offset(int xOrY) {
return xOrY * 3;
}
}
:そうあなたはロジックは次のようになります :私たちは、そう私はこのようなJavaのenums
を使用することをお勧め (...それぞれに9位であり9つのブロック)を事前に知りますJavaの列挙型と優れた識別子名の重要性位置要素の名前が何とかにつながる可能性があり、そのコンストラクタ値を繰り返して交換することができるforechが
をループするJava 8ストリームAPIを使用して
がそれを手に入れたかもしれません!私が答えを受け入れる前に、もう少し質問をしてください。 'int ox = offset%3;'と 'int oy = offset/3;'は3x3グリッドをループするのにどのように役立っていますか?そしてなぜ他のものより 'HashSet'ですか? –
また、「0.6」の場合は1に丸めますか?または依然として「0」であるか? –
@KuNole 'System.out.println'を追加して、' board'から値を取得しているところに 'x + ox'と' y + oy'があるのを見てください。それからあなたは見ることができるはずです。 – ajb