2

のボードゲームをデザインしてい(1000 x 1000)ます。ボードはユニークな数字でいっぱいです。生成された数値をボード上の数値と比較し、ボード上の数値に取り消し線を引く乱数ジェネレーターを呼び出します。これが発生するたびに、行/列/対角線全体が取り消し線で囲まれているかどうかを確認する必要があり、そうであれば別の作業に進む必要があります。

行/列/対角線をチェックするために数値が呼び出された後に毎回反復するのではなく、すでにチェックされているものをキャッシュして、いくつかの反復を繰り返す必要がないようにする方法はありますか?

4

4 に答える 4

2

私がこれを正しく理解すれば、それはある種のビンゴのようなゲームです。

上記を読んで、行または列をチェックするだけでよい場合は、1000に到達するためのイテレータを用意することが解決策になります。

ただし、対角線もチェックする必要があるため、イテレータを増やすことはできません。IE:対角線には3つの数字だけを含めることができ、1000ではなく3つの数字で消すことができます。

通過する任意の位置について、その行、列、および対角線が何であるかを通知するアルゴリズムを使用できます。

これらの値がすべて真の場合、行/列の対角線全体をキャンセルしました。固定の1000x1000マトリックスがあるため、(int)(CalledNumber / 1000)-1がチェックする行、(CalledNumber%1000)が列です。対角線を取得するには、上に移動する行ごとに1列を減算し、左から右に移動するときに下に移動する行ごとに1列を加算し、右から左に移動するときに逆の操作を追加します。

これはブール[1000][1000]行列になるため、必要なすべての位置を収集したら、行/対角/列全体に取り消し線が引かれている場合は、AND条件でそれらをチェックします。

そうすれば、各数値に関連する位置を取得する必要があり、ブール値でのチェックは十分に高速であり、多くのメモリを必要としません。

編集:他の可能な方法はすでに投稿されています:すべての対角線/行の列を事前に計算し、いくつかのカウンターを減らしますが、メモリの無駄が少しあります。

于 2012-04-23T00:38:06.563 に答える
1

はいあります。しかし、1000 はそれほど大きな数ではないため、頻繁に行う場合を除いて、その必要がないことに気付くかもしれません私のアドバイスは、あなたが持っているものから始めて 、明確な問題が発生した場合にのみこれを導入することです.

私が考えているのは、各行、列、および対角線で取り消し線が引かれていない数字の数を単純に数えることです (以降、これらをコレクションと呼びます)。これらはコレクションの最大値に初期化され、セルに取り消し線を引く (入力済みから取り消し線付きに変更する) たびに、関連する値を減らすだけです。

次のマトリックスを検討してください。

abc
def
ghi

を「消す」と、 の行カウンター、 の列カウンター、および の対角カウンターfが減少します。行と列のインデックスは、既に持っている情報 (取り消し線を引いたセルの行または列) を正確に反映しているため、簡単に計算できます。対角インデックスは、行と列の両方を使用する式であるため、わずかに難しくなります。defcfibfhf

特定のセルのカウンターを特定してデクリメントしたら、カウントをゼロに対してチェックするだけです。ゼロは、コレクション内のすべての要素に取り消し線が引かれたことを意味します。

于 2012-04-23T00:16:24.840 に答える
0

各列または行の単純なカウンターのアイデアが本当に好きですが、BitSet も検討できます。利点は、どうしても必要な場合に、まだ残っている細胞を見つけることができることです。これが役に立たない場合は、カウンターを使用してください。

于 2012-04-23T00:19:43.683 に答える
0

BitSetの配列またはコレクションが役立つ場合があります。

于 2012-04-23T00:19:45.723 に答える