LeetCode - 36。有効な数独

問題のI.説明

9x9の数独ボードが有効であるかどうかを判断します。充填されたセルのみを検証する必要があり、以下によります

ルール:

  1. 各行は、繰り返しなしの数字1-9が含まれている必要があります。
  2. 各列は、繰り返しなしの数字1-9が含まれている必要があります。
  3. グリッドの9 3x3のサブボックスのそれぞれは、繰り返しなしの数字1~9を含んでいなければなりません。

有効で部分的に満たされた数独。

空のセルを文字で埋めているところ数独ボードは、部分的に、埋めることができました'.'

例1:

入力:
[
  「。」「」「」「」「」「。」[「5」、」3” 、」7” 、、、、]、
  「。」[ 『6』、 」。」、」1” 、」9” 、」5” 、」。」、」」、」」]、
  [ 『』、」9” 、」8” 、」。」、」。」、 」。」、」。」、」6” 、」。」]、
  [ 『8』、」。」、」。」、」。」、」6” 、」。」、」。」、」。」、 「3” ]、
  [ 『4』、」。」、」」、」8” 、」。」、」3” 、」。」、」」、」1” ]、
  [ 『7』、」。 」、」。」、」。」、」2” 、」。」、」。」、」。」、」6” ]、
  [ 『』、」6” 、」。」、」。」、」。 」、」。」、」2” 、」8” 、」。」]、
  [ 『』、」」、」」、」4” 、」1” 、」9” 、」。」、」。 」、」5” ]、
  [ 『』、」「、」「、」「、」8” 、」「、」「、」7” 、」9” ]。。。。。。
]
出力:真

例2:

入力:
[
  「。」「」「」「」「」「。」[「8」、」3” 、」7” 、、、、]、
  「。」[ 『6』、 」。」、」1” 、」9” 、」5” 、」。」、」」、」」]、
  [ 『』、」9” 、」8” 、」。」、」。」、 」。」、」。」、」6” 、」。」]、
  [ 『8』、」。」、」。」、」。」、」6” 、」。」、」。」、」。」、 「3” ]、
  [ 『4』、」。」、」」、」8” 、」。」、」3” 、」。」、」」、」1” ]、
  [ 『7』、」。 」、」。」、」。」、」2” 、」。」、」。」、」。」、」6” ]、
  [ 『』、」6” 、」。」、」。」、」。 」、」。」、」2” 、」8” 、」。」]、
  [ 『』、」」、」」、」4” 、」1” 、」9” 、」。」、」。 」、」5” ]、
  [ 『』、」「、」「、」「、」8” 、」「、」「、」7” 、」9” ]。。。。。。
]
出力:偽
説明:実施例1と同様に、2つの8件の左上3x3のサブボックスであるので8に修飾されている左上隅における5を除いて、それは無効です。

注意 :

  • (部分的に満たされた)数独ボードは有効であるが、必ずしも解決可能ではありませんでした。
  • 充填されたセルのみが言及したルールに従って検証する必要があります。
  • 与えられたボードのみの数字1-9と文字が含まれています'.'
  • 与えられた基板サイズは常にあります9x9

第二に、問題解決のためのアイデア

私はそれだけで停止したと思った一見、非常に複雑になります。タイトルを読んだ後、私は唯一の有効ではありません、現在のボード上の数字を判断するように求め、この最終的な数を考慮する必要が唯一の可能な解決策ではありませんが見つかりません。これは、現在、既存のボードは、要件の数独のルールを満たしているかどうかを判断する必要があると等価です。

数独のルールは、各行、各列、および各ことを必要3x3含むかどうかをサブ基板、1-99つの図は繰り返しません。今検討し、確かに我々は3つの状態配列を設定することができ、再度、ボード全体をスキャンする必要があるだけでなく、次の各レコードにスキャン行/列/子棋盘数、特定のスキャン場合、登場している行/列/子棋盘繰り返し要素の前にそこに登場していますスキャンの際に終了するまで、だけでなく、重複要素が効果的なボードを説明見つけるために、trueを返し、直接、falseを返します。ただし、すべてのレコードに起因する行/列/子棋盘状態を、我々は3つの大きな配列を宣言する必要があるので、スペースの消費量が高いほど、最適解があるはずです。

コメントエリアを解決するための一般的な考え方は、その後、状態配列を格納する方法を模索との主な相違点と類似しています。一つの方法は、ビット演算を使用して最適化されて実装され、この方法は唯一多くのスペースを節約するために、短い線の状態を保存し、効率も向上します。

  1. 各ラインのステータスが0に初期化されます。
  2. 数NUMに遭遇した結果が0でない場合は、NUMビットは、操作と状態の数で残される、反復を示し、falseを返し、そうでない場合、何の繰り返しは、状態を更新しない、すなわち、2つ以上の数の動作を行います。

参考:
C ++は非常にシンプルで理解して使いやすいです。ビット演算を使用して
私のC ++コード(O(N2)時間と空間)

第三に、コード

ソリューション1

      
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
      
      
クラス {
公共
BOOL isValidSudoku ベクトル < ベクトル < チャー >>&ボード) {
ベクター < ベクトル < BOOL >>行( 9 ベクトル < BOOL >( 9 ))。
ベクター < ベクトル < BOOL >>列( 9 ベクトル < BOOL >( 9 ))。
vector< vector< bool>> sub_box( 9, vector< bool>( 9, false));
for( int i = 0; i < 9; i++)
{
for( int j = 0; j < 9; j++)
{
if(board[i][j] == '.') continue;
int sub_box_index = (i/ 3)* 3 + (j/ 3);
int num = board[i][j] - '1';
if(rows[i][num] || columns[j][num] || sub_box[sub_box_index][num])
return false;
rows[i][num] = columns[j][num] = sub_box[sub_box_index][num] = true;
}
}
return true;
}
};

利用位操作

      
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
      
      
class {
public:
bool isValidSudoku(vector<vector<char>>& board) {
vector< short> col( 9, 0);
vector< short> block( 9, 0);
vector< short> row( 9, 0);
for ( int i = 0; i < 9; i++)
for ( int j = 0; j < 9; j++)
{
if (board[i][j] != '.')
{
int idx = 1 << (board[i][j] - '0');
if (row[i] & idx || col[j] & idx || block[i/ 3 * 3 + j / 3] & idx)
return false;
row[i] |= idx;
col[j] |= idx;
block[i/ 3 * 3 + j/ 3] |= idx;
}
}
return true;
}
};

解法3

      
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
      
      
class {
public:
bool isValidSudoku(vector<vector<char> > &board) {
char existNum[ 10][ 10]={ 0};
int i,j;
for(i= 0; i< 9; i++)
{
for(j= 0; j< 9; j++)
{
if(board[i][j]!= '.')
{
if(existNum[i][board[i][j] - '0'] & 0x1) return false;
if(existNum[j][board[i][j] - '0'] & 0x2) return false; // check if the j-col already has such number, 2-LSB
if(existNum[(i/ 3) * 3 + j/ 3][board[i][j] - '0'] & 0x4) return false; // check if the k-subblock already has such number, 3-LSB
existNum[i][board[i][j] - '0'] ^= 0x1;
existNum [J] [ボード[I] [J] - '0' ] ^ = 0x2の
existNum [(I / 3)* 3 + J / 3 ] [ボード[I] [J] - '0' ] ^ = 0x4の
}
}
}
返す ;
}
}。

オリジナル:ビッグボックス  LeetCode - 36有効な数独。


おすすめ

転載: www.cnblogs.com/wangziqiang123/p/11618371.html