#數(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)