第7講 数独作成アプリVer.2に1:1対応確定と排除を組み込む
第7話 相補確定+破綻処理に確定による排除を加える
コード変更部分
Function rhk(g As Byte) 'ライン排除確定解析+相補確定解析プロシージャ
・
If w = 2 Then '以下相補確定解析ための手続き
・
Next '相補確定による破綻解析
For l = 0 To n_1 '以下相補確定による排除解析
If l <> xs(0) And l <> xs(1) Then
If p(j, l) = 0 Then
For m = 0 To mx(j, l)
If rlst(j, l, m) = i + 1 Then
sy(g, sc(g)) = j
sx(g, sc(g)) = l
' cmx(g, sy(g, sc(g)), sx(g, sc(g))) = mx(sy(g, sc(g)), sx(g, sc(g)))
' For o = 0 To n_1
' crlst(g, sy(g, sc(g)), sx(g, sc(g)), o) = rlst(sy(g, sc(g)), sx(g, sc(g)), o)
' Next
' For o = 0 To n_1
' ckh(g, sy(g, sc(g)), sx(g, sc(g)), o) = kh(sy(g, sc(g)), sx(g, sc(g)), o)
' Next
rlst(sy(g, sc(g)), sx(g, sc(g)), m) = rlst(sy(g, sc(g)), sx(g, sc(g)), mx(sy(g, sc(g)), sx(g, sc(g))))
rlst(sy(g, sc(g)), sx(g, sc(g)), mx(sy(g, sc(g)), sx(g, sc(g)))) = i + 1
mx(sy(g, sc(g)), sx(g, sc(g))) = mx(sy(g, sc(g)), sx(g, sc(g))) - 1
kh(sy(g, sc(g)), sx(g, sc(g)), i) = 0
' hth(g, sy(g, sc(g)), sx(g, sc(g))) = 1
sc(g) = sc(g) + 1
Exit For
End If
If rlst(j, l, m) = k + 1 Then
sy(g, sc(g)) = j
sx(g, sc(g)) = l
' cmx(g, sy(g, sc(g)), sx(g, sc(g))) = mx(sy(g, sc(g)), sx(g, sc(g)))
' For o = 0 To n_1
' crlst(g, sy(g, sc(g)), sx(g, sc(g)), o) = rlst(sy(g, sc(g)), sx(g, sc(g)), o)
' Next
' For o = 0 To n_1
' ckh(g, sy(g, sc(g)), sx(g, sc(g)), o) = kh(sy(g, sc(g)), sx(g, sc(g)), o)
' Next
rlst(sy(g, sc(g)), sx(g, sc(g)), m) = rlst(sy(g, sc(g)), sx(g, sc(g)), mx(sy(g, sc(g)), sx(g, sc(g))))
rlst(sy(g, sc(g)), sx(g, sc(g)), mx(sy(g, sc(g)), sx(g, sc(g)))) = k + 1
mx(sy(g, sc(g)), sx(g, sc(g))) = mx(sy(g, sc(g)), sx(g, sc(g))) - 1
kh(sy(g, sc(g)), sx(g, sc(g)), k) = 0
' hth(g, sy(g, sc(g)), sx(g, sc(g))) = 1
sc(g) = sc(g) + 1
Exit For
End If
Next
End If
End If
Next '以上相補確定による解除解析
If hth(g, j, xs(0)) = 0 Then '以下相補確定
・
'以下各数字に対応する列におけるライン排除確定があるかを調べるための手順
For i = 0 To n_1 'i + 1 は入力する数字を示す。
For j = 0 To n_1 'jはy座標(縦座標)
・
Next '以上相補確定破綻解析
For l = 0 To n_1 '以下相補確定による排除解析
If l <> ys(0) And l <> ys(1) Then
If p(l, j) = 0 Then
For m = 0 To mx(l, j)
If rlst(l, j, m) = i + 1 Then
sy(g, sc(g)) = l
sx(g, sc(g)) = j
' cmx(g, sy(g, sc(g)), sx(g, sc(g))) = mx(sy(g, sc(g)), sx(g, sc(g)))
' For o = 0 To n_1
' crlst(g, sy(g, sc(g)), sx(g, sc(g)), o) = rlst(sy(g, sc(g)), sx(g, sc(g)), o)
' Next
' For o = 0 To n_1
' ckh(g, sy(g, sc(g)), sx(g, sc(g)), o) = kh(sy(g, sc(g)), sx(g, sc(g)), o)
' Next
rlst(sy(g, sc(g)), sx(g, sc(g)), m) = rlst(sy(g, sc(g)), sx(g, sc(g)), mx(sy(g, sc(g)), sx(g, sc(g))))
rlst(sy(g, sc(g)), sx(g, sc(g)), mx(sy(g, sc(g)), sx(g, sc(g)))) = i + 1
mx(sy(g, sc(g)), sx(g, sc(g))) = mx(sy(g, sc(g)), sx(g, sc(g))) - 1
kh(sy(g, sc(g)), sx(g, sc(g)), i) = 0
' hth(g, sy(g, sc(g)), sx(g, sc(g))) = 1
sc(g) = sc(g) + 1
Exit For
End If
If rlst(l, j, m) = k + 1 Then
sy(g, sc(g)) = l
sx(g, sc(g)) = j
' cmx(g, sy(g, sc(g)), sx(g, sc(g))) = mx(sy(g, sc(g)), sx(g, sc(g)))
' For o = 0 To n_1
' crlst(g, sy(g, sc(g)), sx(g, sc(g)), o) = rlst(sy(g, sc(g)), sx(g, sc(g)), o)
' Next
' For o = 0 To n_1
' ckh(g, sy(g, sc(g)), sx(g, sc(g)), o) = kh(sy(g, sc(g)), sx(g, sc(g)), o)
' Next
rlst(sy(g, sc(g)), sx(g, sc(g)), m) = rlst(sy(g, sc(g)), sx(g, sc(g)), mx(sy(g, sc(g)), sx(g, sc(g))))
rlst(sy(g, sc(g)), sx(g, sc(g)), mx(sy(g, sc(g)), sx(g, sc(g)))) = k + 1
mx(sy(g, sc(g)), sx(g, sc(g))) = mx(sy(g, sc(g)), sx(g, sc(g))) - 1
kh(sy(g, sc(g)), sx(g, sc(g)), k) = 0
' hth(g, sy(g, sc(g)), sx(g, sc(g))) = 1
sc(g) = sc(g) + 1
Exit For
End If
Next
End If
End If
Next '以上相補確定による排除解析
If hth(g, j, ys(0)) = 0 Then '以下相補確定解析
・
'以下各数字に対応するブロックにおけるライン排除確定があるかを調べるための手順
For i = 0 To n_1 'i + 1 は入力する数字を示す。
For j = 0 To n_1 'jはy座標(縦座標)
・
Next '以上相補確定による破綻解析
For l = 0 To n_1 '以下相補確定による排除解析
ls = Int(l / rn)
la = l Mod rn
If (xbs + la <> xs(0) And ybs + ls <> ys(0)) And (xbs + la <> xs(1) And ybs + ls <> ys(1)) Then
If p(ybs + ls, xbs + la) = 0 Then
For m = 0 To mx(ybs + ls, xbs + la)
If rlst(ybs + ls, xbs + la, m) = i + 1 Then
sy(g, sc(g)) = ybs + ls
sx(g, sc(g)) = xbs + la
' cmx(g, sy(g, sc(g)), sx(g, sc(g))) = mx(sy(g, sc(g)), sx(g, sc(g)))
' For o = 0 To n_1
' crlst(g, sy(g, sc(g)), sx(g, sc(g)), o) = rlst(sy(g, sc(g)), sx(g, sc(g)), o)
' Next
' For o = 0 To n_1
' ckh(g, sy(g, sc(g)), sx(g, sc(g)), o) = kh(sy(g, sc(g)), sx(g, sc(g)), o)
' Next
rlst(sy(g, sc(g)), sx(g, sc(g)), m) = rlst(sy(g, sc(g)), sx(g, sc(g)), mx(sy(g, sc(g)), sx(g, sc(g))))
rlst(sy(g, sc(g)), sx(g, sc(g)), mx(sy(g, sc(g)), sx(g, sc(g)))) = i + 1
mx(sy(g, sc(g)), sx(g, sc(g))) = mx(sy(g, sc(g)), sx(g, sc(g))) - 1
kh(sy(g, sc(g)), sx(g, sc(g)), i) = 0
' hth(g, sy(g, sc(g)), sx(g, sc(g))) = 1
sc(g) = sc(g) + 1
Exit For
End If
If rlst(ybs + ls, xbs + la, m) = k + 1 Then
sy(g, sc(g)) = ybs + ls
sx(g, sc(g)) = xbs + la
' cmx(g, sy(g, sc(g)), sx(g, sc(g))) = mx(sy(g, sc(g)), sx(g, sc(g)))
' For o = 0 To n_1
' crlst(g, sy(g, sc(g)), sx(g, sc(g)), o) = rlst(sy(g, sc(g)), sx(g, sc(g)), o)
' Next
' For o = 0 To n_1
' ckh(g, sy(g, sc(g)), sx(g, sc(g)), o) = kh(sy(g, sc(g)), sx(g, sc(g)), o)
' Next
rlst(sy(g, sc(g)), sx(g, sc(g)), m) = rlst(sy(g, sc(g)), sx(g, sc(g)), mx(sy(g, sc(g)), sx(g, sc(g))))
rlst(sy(g, sc(g)), sx(g, sc(g)), mx(sy(g, sc(g)), sx(g, sc(g)))) = k + 1
mx(sy(g, sc(g)), sx(g, sc(g))) = mx(sy(g, sc(g)), sx(g, sc(g))) - 1
kh(sy(g, sc(g)), sx(g, sc(g)), k) = 0
' hth(g, sy(g, sc(g)), sx(g, sc(g))) = 1
sc(g) = sc(g) + 1
Exit For
End If
Next
End If
End If
Next '以上相補確定による排除解析
If hth(g, ys(0), xs(0)) = 0 Then '以下相補確定
・
End Function
Ver.2に相補確定+綻処理に確定による排除を加えたプログラム
「第8話の課題です。
3on3を組み込んで下さい。
今回は一気に、確定+破綻+排除を組み込みましょう。
3on3はかなり粘り強くやらないと、
プログラミングできません。
頑張りましょう。」
と一度申し上げましたが、
3on3は、簡単に攻め落とせない難攻不落城であることが、
研究によって分かりました。
初心者の方に、プログラミング歴25年の私でさえ、
挫けそうになってしまった課題を、
解いて頂くのは、無理難題というしかないでしょう。
ですが、数独(ナンプレ)のクォリティーを上げるためには、
3on3は避けては通れない課題です。
そこで、3on3を1つの話から1つの講に繰り上げ、
第8講のテーマとしたいと思います。
したがいまして、
Ver.2に相補確定による破綻処理を加えたプログラムは
数独(ナンプレ)自動作成アプリVer.3と名称を改めます。
トップページにも泣き言を漏らしましたように、
ものごとを文章説明することは、
大変難しいことです。
やっとの思いで組んだプログラミングを皆さんに説明しているのですから、
私は、自分の力以上のことをやって来たし、
これからもやならなければなりません。
ですが、なるべく分かりやすい講義になるように最善を尽くしますので、
皆さん、是非忍耐強くついてきて下さい。
心からお願いします。
eclipse c++ 入門
魔方陣 数独(ナンプレ)で学ぶ VBA 入門
数独(ナンプレ)のシンプルな解き方・簡単な解法の研究
vc++講義へ
excel 2013 2010 2007 vba入門へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
eclipse java 入門へ
excel 2016 vba 入門へ
小学生からエンジニアまでのRuby入門へ
本サイトトップへ