數(shù)獨的R語言實現(xiàn)

#數(shù)獨程序說明V1.1-by(jiangli) R

#輸入9*9 數(shù)獨題目,解出所有可能

###目前計算機解數(shù)獨主要靠遍歷

###能否用神經(jīng)網(wǎng)絡(luò)解決數(shù)獨問題?有明確的起點與終點

###部分題目訓(xùn)練后能主動推導(dǎo)出結(jié)果

###建立目標(biāo)改進函數(shù),越接近結(jié)果函數(shù)值越小。。。。。

#已改進--使用函數(shù)

#擬改進--算法優(yōu)化、效率優(yōu)化、網(wǎng)上運行(在scriptsmax.com上部署)

#函數(shù) f_sd

f_sd <- function(sd){

? shudu = sd

? #1.1 對數(shù)組進行矩陣化

? dim_shudu = matrix(shudu,nrow=9)

? mark_num = 0

? mark_i = c()

? mark_j = c()


? #2? 標(biāo)注需填寫的數(shù)組

? for (i in 1:9)

? ? for(j in 1:9)

? ? ? if(dim_shudu[i,j] == 0){

? ? ? ? mark_num = mark_num + 1

? ? ? ? mark_i[mark_num] = i

? ? ? ? mark_j[mark_num] = j

? ? ? }



? sign = F

? begin = 1

? times = 0


? #3 數(shù)獨處理程序

? #打印原數(shù)組

? print("題目")

? print(t(dim_shudu))


? while(sign == F){

? ? #統(tǒng)計第一個處理的次數(shù)times次數(shù)>9出錯。

? ? if(begin ==1) times=times+1


? ? #將當(dāng)前填寫的格數(shù)值加上1

? ? num = dim_shudu[mark_i[begin],mark_j[begin]] + 1

? ? if(num > 9 ){

? ? ? #當(dāng)填寫數(shù)字大于9的時候,回退到上一填空格

? ? ? #并清空當(dāng)前填寫的格

? ? ? dim_shudu[mark_i[begin],mark_j[begin]] = 0

? ? ? begin = begin -1

? ? }else{

? ? ? dim_shudu[mark_i[begin],mark_j[begin]] = num

? ? ? #同行的數(shù)不出現(xiàn)重復(fù)

? ? ? if(length(which(dim_shudu[mark_i[begin],]==num))>1){

? ? ? ? next

? ? ? }

? ? ? #同列的數(shù)不出現(xiàn)重復(fù)

? ? ? if(length(which(dim_shudu[,mark_j[begin]]==num))>1){

? ? ? ? next

? ? ? }

? ? ? #同塊的數(shù)不出現(xiàn)重復(fù)

? ? ? {

? ? ? ? #判斷是處于哪一塊

? ? ? ? li = (mark_i[begin]-1)%/%3 *3 +1

? ? ? ? lj = (mark_j[begin]-1)%/%3 *3 +1

? ? ? ? x = dim_shudu[c(li,li+1,li+2),c(lj,lj+1,lj+2)]

? ? ? ? if(length(which(x[,]==num)) > 1){

? ? ? ? ? next

? ? ? ? }

? ? ? }


? ? ? #判斷是否執(zhí)行到最后一個空格 begin == length(mark_i)

? ? ? #打印結(jié)果

? ? ? if(begin == length(mark_i)){

? ? ? ? print("數(shù)獨答案")

? ? ? ? print(t(dim_shudu))

? ? ? }else{

? ? ? ? #進行下一個空格處理

? ? ? ? begin = begin + 1

? ? ? }

? ? }

? ? #處理完成退出程序

? ? if(begin > length(mark_i)){

? ? ? sign = T

? ? }

? ? #異常退出數(shù)據(jù)

? ? if(times >9){

? ? ? print("輸入的數(shù)據(jù)錯誤")

? ? ? sign = T

? ? }

? }

}

###--------------------分割線--------

###--------------------輸入條件,運行函數(shù)f_sd()-------

#1.輸入數(shù)獨數(shù)組

shudu = c(5,0,0,0,9,0,2,0,1,

? ? ? ? ? 0,0,2,0,0,7,0,0,8,

? ? ? ? ? 0,8,0,0,0,0,3,0,0,

? ? ? ? ? 0,1,4,0,0,5,0,0,0,

? ? ? ? ? 0,0,0,9,0,3,0,0,0,

? ? ? ? ? 0,0,0,8,0,0,9,4,0,

? ? ? ? ? 0,0,3,0,0,0,0,6,0,

? ? ? ? ? 6,0,0,2,0,0,1,0,0,

? ? ? ? ? 8,0,9,0,6,0,0,0,0)

#2.運行函數(shù)f_sd()

f_sd(shudu)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容