判斷一個(gè)?9x9 的數(shù)獨(dú)是否有效溉知。只需要根據(jù)以下規(guī)則蛋铆,驗(yàn)證已經(jīng)填入的數(shù)字是否有效即可。
數(shù)字1-9在每一行只能出現(xiàn)一次硼瓣。
數(shù)字1-9在每一列只能出現(xiàn)一次。
數(shù)字1-9在每一個(gè)以粗實(shí)線分隔的3x3宮內(nèi)只能出現(xiàn)一次置谦。
上圖是一個(gè)部分填充的有效的數(shù)獨(dú)堂鲤。
數(shù)獨(dú)部分空格內(nèi)已填入了數(shù)字,空白格用'.'表示媒峡。
示例?1:
輸入
示例?2:
輸入:
輸出:false解釋:除了第一行的第一個(gè)數(shù)字從 5改為8 以外瘟栖,空格內(nèi)其他數(shù)字均與 示例1 相同。? ? 但由于位于左上角的 3x3 宮內(nèi)有兩個(gè) 8 存在, 因此這個(gè)數(shù)獨(dú)是無效的谅阿。
說明:
一個(gè)有效的數(shù)獨(dú)(部分已被填充)不一定是可解的半哟。
只需要根據(jù)以上規(guī)則,驗(yàn)證已經(jīng)填入的數(shù)字是否有效即可奔穿。
給定數(shù)獨(dú)序列只包含數(shù)字1-9和字符'.'镜沽。
給定數(shù)獨(dú)永遠(yuǎn)是9x9形式的。
讀題讀題:讀不下去了贱田,什么玩意啊缅茉,沒見過啊,給一個(gè)由列表組成的列表男摧,然后返回真假蔬墩。
有心搞一個(gè)隨機(jī)算法译打,隨機(jī)返回0,1。也就是傳說中的猴子算法拇颅,如果樣例不多完全可行奏司,我甚至用這個(gè)方法解決點(diǎn)觸驗(yàn)證碼,活該找不著工作樟插。
沉下心來思考韵洋,這是基礎(chǔ)題,不會(huì)難的黄锤,首先解決一個(gè)問題搪缨,什么是數(shù)獨(dú)?這個(gè)不知道這題不用做了鸵熟。
數(shù)獨(dú)盤面是個(gè)九宮副编,每一宮又分為九個(gè)小格。在這八十一格中給出一定的已知數(shù)字和解題條件流强,利用邏輯和推理痹届,在其他的空格上填入1-9的數(shù)字。使1-9每個(gè)數(shù)字在每一行打月、每一列和每一宮中都只出現(xiàn)一次队腐,所以又稱“九宮格”。
嗯僵控,9*9的數(shù)獨(dú)香到,那就是9個(gè)宮,題里由數(shù)字和逗號(hào)組成报破,如果全在,那就是123456789千绪,
沒有0充易,九個(gè)數(shù)字,那就是
我們要判斷每一行中現(xiàn)有數(shù)字有沒有重復(fù)的荸型,每一列中數(shù)字有沒有重復(fù)的盹靴,每一宮中有沒有重復(fù)的,每個(gè)列表在都包含數(shù)字和字符點(diǎn)瑞妇,我們要判斷數(shù)字重復(fù)首先就要去除干擾項(xiàng)點(diǎn)稿静,
行判斷:a = 100? ?設(shè)置一個(gè)初始值
????????????????for i in range(len(board):? ?每個(gè)列表是一行
?? ? ? ? ? ? ? ? ? for j in range(len(board[i])):? ?遍歷每一行? 必須要有【:】 每次提取i的一個(gè)復(fù)制,然后對(duì)i操作
? ? ? ? ? ? ? ? ? ? ? ? if board[i][j] == '.':? ? 判斷元素是不是點(diǎn)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?board[i][j] = a
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?a += 1
? ? ?不用去除的方法辕狰,去除后元素位置還都變了改备,將所有點(diǎn)都變成不同的數(shù)字,設(shè)置一個(gè)初始值a = 100蔓倍,每當(dāng)遇到空白符號(hào)就將其變成a,a自增1.
這樣就完成了預(yù)處理悬钳,然后開始判斷盐捷,每一個(gè)區(qū)域都是9個(gè)元素組成,如果有重復(fù)的默勾,那么這個(gè)數(shù)獨(dú)為假碉渡,用set方法去重判斷長度是否變化
for i in range(9):
b = [ ]? 完成一列清空一列
行? ? ? ? ? ? if len(set(board[i]) != 9:
? ? ? ? ? ? ? ? ? ? ? ? rreturn 0
? 列? ? ? ? ? ?for j in range( 9):
? ? ? ? ? ? ? ? ? ? ? ? b.append(board[j][i])? 每一列組成一個(gè)列表
? ? ? ? ? ? ? ? if? len(set(b)) !=9:
? ? ? ? ? ? ? ? ? ? ? ? return 0? ? ? ? ? ? ? ? ? ?
然后是對(duì)每個(gè)宮組成列表,觀察規(guī)律母剥,a00a01a02a10a11a12a20a21a22
那就是橫豎都遍歷0到2滞诺,所有宮都是差3,
橫著數(shù)3個(gè)宮环疼,豎著數(shù)3個(gè)宮习霹,我僵住了,好難啊
找到九個(gè)基準(zhǔn)點(diǎn)?
22,25,28,52,55,58,82,85,88秦爆,沒什么用序愚,做減法更難
00,03等限,06爸吮,30, 33,36望门,60形娇,63,66
居然搞了3層for筹误,都不如手寫九個(gè)列表
3層不行就4層桐早,我真是個(gè)人才
開干
通過470個(gè)樣例,那我大體方法應(yīng)該沒錯(cuò)厨剪,那就是數(shù)獨(dú)還有什么條件沒注意到
觀察一下哄酝,宮三處有兩個(gè)1,然后找宮的問題祷膳,嗯陶衅,NB,for我能寫成if直晨,改正2缶!S禄省U志洹!
四層for循環(huán)能這樣敛摘,看樣子我沒什么問題门烂,學(xué)習(xí)一下別人的。
太長了着撩,感覺就是繁瑣诅福,雖然整體不大匾委,行9個(gè)列表,列九個(gè)列表氓润,宮9個(gè)列表赂乐,一共純手寫也就27個(gè),運(yùn)行時(shí)間可能更短咖气,但構(gòu)造列表的方法是重要的挨措。并且應(yīng)該花時(shí)間深入了解一下字典,看別人用的不少崩溪,沒感覺到有什么優(yōu)勢(shì)浅役,但也要學(xué)習(xí)一下。