我一直覺得程式設計是一件極其有意思的事情,雖然沒有特别聰明的頭腦,也沒有對某領域做過深入研究(其實也不知道要研究哪些領域,老師覺得研究哪個領域都可,要看以後做什麼了,不知道這麼想對不對,但有一點一定是正确的,那就是打好基礎,将基本的資料結構和算法掌握透徹才是現在的王道),但很是着迷于一些算法、密碼什麼的,我本人不太喜歡看書,是以大部分事情都是在電腦上進行,刷了LeetCode上的150題,并對這些題深入思考,看文章部落格,找尋更多地解題路子,然後總結思路代碼寫部落格,又做了些ACM俱樂部的題目,最近這兩天又在學習結構之法——算法之道部落客的一系列部落格,什麼程式員面試寶典啊、何海濤面試100題啊什麼的,看到有興趣的就做做,零零散散下來也有不少題目和心得了,但是能力的提升不是靠刷題的多少,更重要的是對資料結構及算法的思考和總結,我一直這麼堅信,是以從現在開始,注重細節、注重總結 趣味題更有意思些,更能增加自己對程式設計的喜愛程度,好玩的事情總是可以反複玩味,那麼第一篇文章就先從趣味題開始吧,我特别喜歡數獨這個遊戲,佩服想出這個遊戲的人,那就先從這個遊戲開始吧。 去年網上看到一則新聞:
據說這是世界上最難的數獨
來源:每日郵報 作者: 2012-07-16 09:18
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauETN2EzMzUjM2ETL2ITNwYTM2ITNwMTMwITLptmYvwlNyUDMzEDMy8CXw9CXt92Yu82cvNnLltWahJmLjlGcvw1LcpDc0RHaiojIsJye.jpg)
英國《每日郵報》6月30日發表了一篇報道,報道稱“芬蘭數學家因卡拉花費3個月設計出了世界上迄今難度最大的數獨遊戲,而且它隻有一個答案。因卡拉說隻有思考能力最快、頭腦最聰明的人才能破解這個遊戲。” 當然我肯定沒有能力手動解決這個問題,我隻是對它說的隻有一個答案充滿了好奇,真的隻有一個答案?看着不像啊。網上有很多實作數獨的方式,剛開始的時候可以學習,但是一定要思考,一定要自己動手實踐,這也是我寫這篇文章的原因所在 算法思想很簡單,深度暴搜,再自己實作一遍,算法思考和加深對遞歸的了解才是目的,那麼就開始吧 1、首先這張圖一定要存起來,matrix數組儲存,空格用0來代替,資料範圍不用考慮,因為所有資料大小都是定的; 2、深搜的一般套路得過一遍,一般都是從第一個位置開始進行,有一記錄通路點的數組,避免通路重複,然後上下左右四個方向,将滿足要求的點進行遞歸調用,這道題肯定要用到回溯,還得将通路過的點回溯回來,隻要在遞歸代碼後加代碼就可以了 3、還有一個問題就是遞歸的結束條件是什麼,怎麼來判斷數獨裡的數都已經填上了數字?每次檢視matrix數組是否都填上了數字當然行不通,可以以下處理 4、其實我們處理的隻是不填數字的位置,将不填數字的位置全部記錄下來,統計空格的個數,遞歸目前狀态就是對其中某個位置的處理,結束條件就是所有位置都填上了數字,那麼這樣的話,我們對所有空位置進行編号,1,2,3 每個位置存儲該位置所在的行和列,可以用結構體數組存,也可以用兩個一維數組存 5、接下來就是判斷位置是否合法,即此位置所在的行列和小九宮格是否已經存在要填的數字,對每個數字都行、列、區域判斷感覺複雜度高了一些,可以用數組來記錄某行或某列的數字存在狀态 想到這感覺差不多了,下面就來實作下,輕車熟路了,希望一次就能運作通過
|
發現果然就隻有一個解啊,數學家就是牛 但是,既然數獨是一款遊戲,遊戲具有一定的可玩性,以上程式可不具備操作性,幸好我這兩年對網站比較感興趣,在學校裡做過一些網站,對javascript、css還是想對熟悉的,廢話不多說,趕緊做一款簡單的網頁遊戲,就先從這個“一鍵生成答案”的“數獨電腦”開始,嘻嘻 既然是網頁,那就稍微做的好看些,多動用些css,還得要簡單,貼上去的代碼可以直接複制粘貼,打開就能用,那就隻能一個頁面搞定,不能用jquery和圖檔啥的,代碼先貼上:
|
直接複制粘貼,儲存html檔案用IE打開就可以了,頁面如下:
功能不多,剛開始是這個預設的最難數獨,也可以自己設定數獨,然後按一鍵生成答案就會出現上面的情況了, 但是,如果要是不滿足數獨的要求的話會卡死的哦 第一章就先寫到這裡吧,以後大約每天寫一篇吧 王川 2014/02/12