数独(ナンプレ)を解くアルゴリズムの要点とパフォーマンスの検証№1
数独(ナンプレ)を解くアルゴリズムを例に、アルゴリズムの要点と、それによるパフォーマンスを検証します、
ここでは、とにかく全ての数字を当てはめていくという、いわば全数チェックでの解法を使いました。
Option Explicit
Private tryCnt As Long
Sub main()
Debug.Print Timer
Dim SuAry(1 To 9, 1 To 9) As Integer
Dim i1 As Integer
Dim i2 As Integer
tryCnt = 0
Erase SuAry
For i1 = 1 To 9
For i2 = 1 To 9
If Cells(i1, i2) = "" Then
Cells(i1, i2).Font.Color = vbBlue
Else
SuAry(i1, i2) = Cells(i1, i2)
End If
Next
Next
Call trySu(SuAry)
Range("A1:I9").Value = SuAry
Debug.Print Timer
If getBlank(SuAry(), i1, i2) = False Then
MsgBox "解読成功" & vbLf & tryCnt
Else
MsgBox "あれれ・・・"
End If
End Sub
Function trySu(ByRef SuAry() As Integer) As Boolean
Dim i1 As Integer
Dim i2 As Integer
Dim su As Integer
If getBlank(SuAry(), i1, i2) = False Then
trySu = True
Exit Function
End If
For su = 1 To 9
If chkSu(SuAry(), i1, i2, su) = True Then
SuAry(i1, i2) = su
tryCnt = tryCnt + 1
Cells(i1, i2) = su
If trySu(SuAry) = True Then
trySu = True
Exit Function
End If
End If
Next
SuAry(i1, i2) = 0
Cells(i1, i2) = ""
DoEvents
trySu = False
End Function
Function getBlank(ByRef SuAry() As Integer, ByRef i1 As Integer, ByRef i2 As Integer) As Boolean
For i1 = 1 To 9
For i2 = 1 To 9
If SuAry(i1, i2) = 0 Then
getBlank = True
Exit Function
End If
Next
Next
getBlank = False
End Function
Function chkSu(ByRef SuAry() As Integer, ByVal i1 As Integer, ByVal i2 As Integer, ByVal su As Integer) As Boolean
Dim ix1 As Integer
Dim ix2 As Integer
Dim i1S As Integer
Dim i2S As Integer
chkSu = False
'横をチェック
For ix2 = 1 To 9
If ix2 <> i2 Then
If SuAry(i1, ix2) = su Then
chkSu = False
Exit Function
End If
End If
Next
'縦をチェック
For ix1 = 1 To 9
If ix1 <> i1 Then
If SuAry(ix1, i2) = su Then
chkSu = False
Exit Function
End If
End If
Next
'枠内をチェック
i1S = (Int((i1 + 2) / 3) - 1) * 3 + 1
i2S = (Int((i2 + 2) / 3) - 1) * 3 + 1
For ix1 = i1S To i1S + 2
For ix2 = i2S To i2S + 2
If ix1 <> i1 Or ix2 <> i2 Then
If SuAry(ix1, ix2) = su Then
chkSu = False
Exit Function
End If
End If
Next
Next
chkSu = True
End Function
※赤字の部分は、今回の検証の為に追加した部分になります。
試行回数をカウントするように変更しました。
これを実行して、じっくり眺めて下さい。
同じテーマ「マクロVBAサンプル集」の記事
アメブロの記事本文をVBAでバックアップする№1
数独(ナンプレ)を解くVBAに挑戦№1
数独(ナンプレ)を解くアルゴリズムの要点とパフォーマンスの検証№1
ナンバーリンク(パズル)を解くVBAに挑戦№1
ナンバーリンクを解くVBAのパフォーマンス改善№1
オセロを作りながらマクロVBAを学ぼう
他ブックへのリンクエラーを探し解除
Excelシートの複雑な計算式を解析するVBA
Excel将棋:マクロVBAの学習用(№1)
Excel囲碁:万波奈穂先生に捧ぐ
Excel囲碁:再起動後も続けて打てるように改造
新着記事NEW ・・・新着記事一覧を見る
SQL基礎問題9:特定商品購入者の平均購入金額|SQL入門(2025-11-04)
SQL基礎問題8:バスケット分析・ペア商品の出現回数|SQL入門(2025-11-04)
SQL基礎問題7:成績表から各教科の最高点と最低点を抽出|SQL入門(2025-11-02)
SQL基礎問題6:成績表から教科ごとの点数ベスト3を抽出|SQL入門(2025-11-02)
SQL基礎問題5:複数のマスタテーブルの結合|SQL入門(2025-11-01)
SQL基礎問題4:2つのテーブルの不一致を抽出|SQL入門(2025-10-29)
SQL基礎問題3:文字列の一部をキーにして集計|SQL入門(2025-10-29)
SQL基礎問題2:文字列「-nn-」のnnが偶数のみ抽出|SQL入門(2025-10-28)
SQL基礎問題1:最大在庫数を持つ製品の在庫金額|SQL入門(2025-10-28)
「ADO + VBA」でSQLを実行するときのVBAサンプル|SQL入門(2025-10-28)
アクセスランキング ・・・ ランキング一覧を見る
1.生成AIパスポート試験 練習問題(四肢択一式)|生成AI活用研究
2.最終行の取得(End,Rows.Count)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.RangeとCellsの使い方|VBA入門
7.FILTER関数(範囲をフィルター処理)|エクセル入門
8.日本の祝日一覧|Excelリファレンス
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.セルのクリア(Clear,ClearContents)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBAサンプル集
- 数独(ナンプレ)を解くアルゴリズムの要点とパフォーマンスの検証№1
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.
