【摘 要】本文通過解決計算機(jī)程序設(shè)計,從而實現(xiàn)重排九宮格問題,使我們青少年達(dá)到掌握更多的計算機(jī)知識,鍛煉編程能力。
【關(guān)鍵詞】計算機(jī);九宮格;程序
重排九宮格顧名思義就是重新排列九宮圖的意思,其玩法是在3×3方格盤上,放有1-8八個數(shù),剩下一格為空,每一空格其周圍的數(shù)字可移至空格。先設(shè)定初始排列數(shù)字,然后開始思考如何以最少的移動次數(shù)來達(dá)到目的。這類小游戲可以鍛煉人的逆向思維能力,是青少年非常喜愛的課余活動。
目前,人們已經(jīng)邁入了網(wǎng)絡(luò)時代,計算機(jī)和互聯(lián)網(wǎng)已經(jīng)與我們的日常工作、學(xué)習(xí)和生活息息相關(guān),我們青少年更加應(yīng)該掌握更多的計算機(jī)知識,尤其學(xué)習(xí)程序設(shè)計語言可以培養(yǎng)我們運(yùn)用算法來解決實際問題的能力,這種解決問題的方式是計算機(jī)所獨(dú)有的,也只有通過對計算機(jī)程序設(shè)計語言和程序設(shè)計方法的學(xué)習(xí)才有可能獲得這種解決問題的能力。使用計算機(jī)程序設(shè)計的方式解決實際問題有諸多的好處主要表現(xiàn)在:
(1)程序設(shè)計的目標(biāo)是用某種計算機(jī)高級算法語言編寫程序?qū)崿F(xiàn)特定的算法的功能。程序設(shè)計要具有強(qiáng)烈的創(chuàng)造意識,為實現(xiàn)預(yù)想的功能要不斷地設(shè)想多種方案,同時又需要具有十分嚴(yán)謹(jǐn)?shù)倪壿嬐评?。因此程序設(shè)計是獲得創(chuàng)造性修養(yǎng)與獲得正確思維方法的極好的科目;
(2)計算機(jī)程序設(shè)計與數(shù)學(xué)是緊密相互聯(lián)系而相輔相成的,它對數(shù)學(xué)的學(xué)習(xí)有著極大的促進(jìn)作用。許多數(shù)學(xué)問題必須要用計算機(jī)才能最終解決問題,反之計算機(jī)的編程常常要借助數(shù)學(xué)的思想與方法才能出色完成任務(wù);
(3)程序設(shè)計是學(xué)習(xí)其他學(xué)科的基礎(chǔ),不論是文科還是理科,特別是學(xué)習(xí)理科學(xué)科,計算機(jī)是一種必不可少的工具。由于在計算機(jī)方面的興趣,新泰一中的高三學(xué)生霍達(dá)通過計算機(jī)程序設(shè)計了一個有效的算法,實現(xiàn)關(guān)于九宮格的重排問題。
為了實現(xiàn)重排九宮格的問題,系統(tǒng)在算法設(shè)計上使用廣度優(yōu)先搜索算法。廣度優(yōu)先搜索算法是一種圖形搜索算法。簡單的說,廣度優(yōu)先搜索算法從根節(jié)點(diǎn)開始,廣度優(yōu)先搜索算法沿著樹的寬度遍歷樹的節(jié)點(diǎn)。
如果所有節(jié)點(diǎn)均被訪問,則算法中止。廣度優(yōu)先搜索的實現(xiàn)一般采用open-closed表(在搜索算法過程中其鄰居節(jié)點(diǎn)尚未被檢驗過的節(jié)點(diǎn)會被放置在一個被稱為open的容器中,而被檢驗過的節(jié)點(diǎn)則被放置在被稱為closed的容器中,簡稱open-closed表)。
對于九宮格重排的問題,系統(tǒng)使用廣度優(yōu)先搜索算法隊列的形式來實現(xiàn),具體實現(xiàn)的算法步驟如下:
步驟1:把初始的狀態(tài)節(jié)點(diǎn)放入一個隊列;
步驟2:如果隊列為空,則問題無解,退出。否則,檢查隊尾的狀態(tài)是否是目標(biāo)狀態(tài),如果是目標(biāo)狀態(tài),轉(zhuǎn)至步驟5;
步驟3:如果不是目標(biāo)狀態(tài),擴(kuò)展當(dāng)前節(jié)點(diǎn),并為每個子節(jié)點(diǎn)配置指向父節(jié)點(diǎn)的指針,把不是當(dāng)前節(jié)點(diǎn)的先輩的子節(jié)點(diǎn)加入到隊頭;
步驟4:隊尾指針指向下一個節(jié)點(diǎn),轉(zhuǎn)至步驟2;
步驟5:當(dāng)前節(jié)點(diǎn)通過其父指針回溯到初始狀態(tài),并為每個節(jié)點(diǎn)設(shè)置其移動的方向,以記錄找到的這條路徑;
步驟6:根據(jù)找到的路徑移動九宮格到達(dá)目標(biāo)狀態(tài);
系統(tǒng)使用目前最流行的Windows平臺應(yīng)用程序開發(fā)環(huán)境Visual Studio實現(xiàn),程序在找到有效路徑后,一步一步地移動到目標(biāo)狀態(tài)過程中,其中最難處理的部分是如何展示移動的過程。系統(tǒng)使用了一個巧妙的方法,系統(tǒng)在運(yùn)行過程中記錄下每次移動的狀態(tài)矩陣,這樣就不必移動格子,只要修改格子里的數(shù)字就可以了。
程序的初始界面如下圖1所示,程序分為開始狀態(tài)和目標(biāo)狀態(tài),開始狀態(tài)顯示的是九宮格初始狀態(tài),目標(biāo)狀態(tài)顯示的是九宮格從開始狀態(tài)最終要移動到的狀態(tài)。程序開始運(yùn)行前,先調(diào)整開始狀態(tài)和目標(biāo)狀態(tài)到任意位置,如圖2所示。然后點(diǎn)擊開始,系統(tǒng)自動從設(shè)定的開始狀態(tài)一步一步移動的設(shè)定的目標(biāo)狀態(tài),如圖3所示。
在計算機(jī)程序?qū)崿F(xiàn)九宮格重排的過程中,不難發(fā)現(xiàn)利用巧妙的算法,計算機(jī)能方便快捷得解決人腦看來復(fù)雜或耗時的問題。而設(shè)計程序的過程不僅充滿趣味與挑戰(zhàn),更能一勞永逸得解決一些需要不斷重復(fù)思考的問題。因此,處于人生充電期的青少年,應(yīng)該勇敢進(jìn)入計算機(jī)的廣闊世界,鍛煉編程能力,讓計算機(jī)成為自己未來求學(xué)和工作道路上的良師益友。