17.四宮數(shù)獨(dú)規(guī)則:在4×4的格子中,根據(jù)已知數(shù)字,推理出所有剩余空格的數(shù)字,并滿足每一行、每一列、每一個宮(粗線框區(qū)域)內(nèi)均含1到4的數(shù)字并且不重復(fù),每道數(shù)獨(dú)有且僅有唯一答案。
例如,根據(jù)規(guī)則推理圖1數(shù)獨(dú),在第一宮中4個格子已經(jīng)3個格子分別是數(shù)字1到3,缺的數(shù)字為4,因此第一行第一格空缺的數(shù)字填4,以此類推,直至將所有格子都推理出來。
(1)根據(jù)上述規(guī)則推理,數(shù)獨(dú)(圖2)第一行A處應(yīng)是數(shù)字
。
(2)小明編寫了四宮數(shù)獨(dú)推算的VB程序,單擊“推算”按鈕Command1后,在列表框List1中輸出數(shù)獨(dú)推算過程和結(jié)果,如圖3所示。實(shí)現(xiàn)推算的VB程序如下,請?jiān)跈M線處填入合適的代碼。
Dimd(1To16)AsInteger'數(shù)組d逐行存儲四宮數(shù)獨(dú)
PrivateSubCommand1_Click ( ?。?br />DimiAsInteger,flagAsBoolean
Fori=1To16
d(i)=0‘值0表示該位置還未填數(shù)字
Nexti
‘初始化數(shù)獨(dú)中已知位置的數(shù)字
d(2)=4:d(11)=3:d(14)=2:d(16)=4
List1.Clear
'在列表框Li1中輸出四宮數(shù)獨(dú),代碼略
flag=False
DoWhileNotflag
①
Fori=1To16
‘函數(shù)check(i)實(shí)現(xiàn)對第i位置進(jìn)行推算
Ifd(i)=0Then
d(i)=check(i)
Ifd(i)>0Then
flag=False
'Forniat(i,″00″)函數(shù)實(shí)現(xiàn)將變量i的值按2個字符寬度輸出
List1.Addltem“第″&Format(i,″00″&″位置填″&d(i)
EndIf
EndIf
Nexti
Loop
'在列表框Lil中輸出四宮數(shù)獨(dú),代碼略
EndSub
根據(jù)每一行、第一列、每一個宮的已有數(shù)字進(jìn)行推算
Functioncheck(xAsInteger)AsInteger
Dimt(0To4)AsInteger,mAsInteger
DimrowAsInteger,colAsInteger,nAsInteger,kAsInteger
Form=0To4
t(m)=0
Nextm
'對當(dāng)前所在行列進(jìn)行推算
row=(x-1)\4+1
col=(x-1)Mod4+1
Form=1To4
t(d(row-1)*4+m)=1
t(②
)=1
Nextm
'進(jìn)行宮內(nèi)推算
Ifrow<=2Andcol<=2Thent(d(7-x))=1
Ifrow<=2Andcol>2Thent(d(11-x)=
Ifrow>2Andcol<=2Thent(d(23-x)=1
Ifrow>2Andcol>2Thent(d(27-x)=1
k=0
Form=1To4
Ift(m)=0Thenn=mElsek=k+1
Nextm
If③
Thencheck=nElsecheck=0
EndFunction