葉均隆 葉均明 余偉紅
摘 要:從多年教學(xué)中,筆者發(fā)現(xiàn)計(jì)算機(jī)專(zhuān)業(yè)的學(xué)生大多數(shù)在學(xué)習(xí)中運(yùn)用的是數(shù)學(xué)邏輯思維,尤其在競(jìng)賽中有獲獎(jiǎng)的同學(xué),如:藍(lán)橋杯獲獎(jiǎng)的。這些優(yōu)秀同學(xué)利用邏輯推理思維去理解某些困難算法,如:八皇后、回溯、廣搜、深搜等算法,表現(xiàn)得非常困難,耗費(fèi)很多時(shí)間仍然不得要領(lǐng)。如果通過(guò)圖像思維幫助其理解困難的算法問(wèn)題,往往事半功倍。因此,文章研究了圖像思維解釋八皇后算法及其拓展問(wèn)題。
關(guān)鍵詞:圖像思維;視覺(jué)化思維;藍(lán)橋杯;八皇后;教學(xué)設(shè)計(jì);算法
運(yùn)用圖像思維解釋八皇后算法問(wèn)題是筆者立項(xiàng)以來(lái)第一個(gè)運(yùn)用案例。文章適合有一定的C語(yǔ)言基礎(chǔ)的,想了解圖像思維的或遞歸算法能力薄弱但想加深理解的讀者。軟件技術(shù)和計(jì)算機(jī)應(yīng)用技術(shù)專(zhuān)業(yè)是筆者所在院系人數(shù)最多的兩個(gè)專(zhuān)業(yè),但在近年來(lái)每次參加藍(lán)橋杯省賽獲一等獎(jiǎng)人數(shù)徘徊在1~2人。藍(lán)橋杯競(jìng)賽的難題的解決主要是能否靈活運(yùn)用適合的算法。通常題目越難,程序算法越復(fù)雜。從參賽的情況看,學(xué)生在軟件技術(shù)中的算法把握得還不夠。機(jī)器學(xué)習(xí)應(yīng)用、自然語(yǔ)言處理、智能無(wú)人機(jī)、計(jì)算機(jī)視覺(jué)與圖像、人工智能、大數(shù)據(jù)、操作系統(tǒng)開(kāi)發(fā)、智能導(dǎo)航等是國(guó)家重點(diǎn)發(fā)展核心領(lǐng)域,而這些領(lǐng)域的基礎(chǔ)都是靠好的算法。算法是軟件的靈魂,得益于好的算法會(huì)給軟件帶來(lái)的往往都是質(zhì)的變化,性能都是呈指數(shù)倍提高的。如何培養(yǎng)學(xué)生程序算法設(shè)計(jì)能力,筆者提出新思路—嘗試運(yùn)用視覺(jué)圖像思維。
1 視覺(jué)圖像思維介紹
視覺(jué)圖像思維自從人類(lèi)誕生就產(chǎn)生了,在沒(méi)有發(fā)明文字前,人們用石器在石頭、木頭等物體上刻畫(huà)圖案用來(lái)表達(dá)事件、物體、動(dòng)作等,人們幾乎不需要怎樣學(xué)習(xí)都能理解其意義。隨著社會(huì)的發(fā)展,原來(lái)的圖案慢慢變成規(guī)則的符號(hào),失去形象的效果,思維方式也慢慢改變。視覺(jué)圖像思維是通過(guò)攝影般逼真的具體圖像來(lái)思考,視覺(jué)化思考的具體程度因人而異。一般的視覺(jué)思考者只能想象靜止的圖像。這些圖像的范圍包括,從具體地點(diǎn)的圖像,到更模糊的概念圖像。運(yùn)用圖像思維的好處有:豐富的信息量、具體且形象、準(zhǔn)確、推理方便、協(xié)助記憶、協(xié)助整理思路等。
2 以經(jīng)典算法八皇后問(wèn)題為例
棋手馬克斯·貝瑟爾于1848年提出:在8×8格的國(guó)際象棋上擺放8個(gè)皇后,使其不能互相攻擊,即任意兩個(gè)皇后都不能處于同一行、同一列或同一斜線(xiàn)上,問(wèn)有多少種擺法[1]。運(yùn)用計(jì)算機(jī)求解8個(gè)皇后問(wèn)題,筆者將問(wèn)題簡(jiǎn)單化,由于運(yùn)算原理相同,先求解四皇后問(wèn)題,那么八皇后問(wèn)題就迎刃而解。四皇后問(wèn)題可再分兩部分處理,第一部分是:編寫(xiě)解決同一行、同一列或同一斜線(xiàn)上判斷函數(shù)(函數(shù)返回“1”代表可此位置可放置棋子)。第二部分是:編寫(xiě)遞歸函數(shù)檢測(cè)所有擺放情況,并算出其中符合要求擺放情況。筆者多年培訓(xùn)藍(lán)橋杯的參賽者發(fā)現(xiàn),第一部分的函數(shù)編寫(xiě)問(wèn)題不大,在第二部分的算法里,學(xué)生能完全理解原理較少。通過(guò)筆者多年的教學(xué)經(jīng)驗(yàn)運(yùn)用圖像分析,學(xué)生的學(xué)習(xí)效果較好,如圖1所示,程序按先根遍歷執(zhí)行,每個(gè)棋盤(pán)旁邊的數(shù)字為計(jì)算機(jī)執(zhí)行的順序。
如果讀者是第一次接觸這個(gè)四皇后問(wèn)題,運(yùn)用圖像思維入手,讀者只需觀察圖1所示的所有信息變化規(guī)律入手,不需閱讀其他文字說(shuō)明,就很容易找出編寫(xiě)遞歸函數(shù)實(shí)現(xiàn)的思路。序號(hào)2,19,32,42就是表格逐列循環(huán)(四皇后循環(huán)4次,八皇后循環(huán)8次如此類(lèi)推)。在序號(hào)2下一層又同樣執(zhí)行逐列循環(huán)(序號(hào)3,4,5,10)。序號(hào)3,4因?yàn)椴环蠗l件停止搜索,不會(huì)放置皇后,而在第二層的序號(hào)5(即檢測(cè)到放置在此位置是安全的,放置第二個(gè)皇后)下一層又同樣執(zhí)行逐列循環(huán)(序號(hào)6,7,8,9)。每個(gè)序號(hào)的下層都會(huì)進(jìn)行同樣的檢索,直至4個(gè)皇后放置完畢,同時(shí)所處的位置安全即是所求的解,具體算法如圖2所示。這里還需注意一點(diǎn),每次放置棋子后往后執(zhí)行需要回溯,例如:細(xì)心的讀者會(huì)發(fā)現(xiàn),序號(hào)5完成一次遞歸函數(shù)調(diào)用會(huì)先清掉當(dāng)前位置的棋子再到序號(hào)10位置運(yùn)行,具體實(shí)現(xiàn)如圖2第11行所示。
3 八皇后算法問(wèn)題拓展
如果棋盤(pán)大小及皇后的個(gè)數(shù)可任意設(shè)置,程序怎么求解有多少種擺法。這個(gè)問(wèn)題可以轉(zhuǎn)化為特定問(wèn)題的解,如:在3×4的棋盤(pán)放2個(gè)皇后,有多少種擺法。通過(guò)上面規(guī)則(4個(gè)皇后在4×4的棋盤(pán))作進(jìn)一步圖形轉(zhuǎn)換(2個(gè)皇后在3×4的棋盤(pán)),如圖3所示。轉(zhuǎn)換成對(duì)應(yīng)的狀態(tài)后,觀察棋盤(pán)狀態(tài)執(zhí)行順序,如圖4所示,在當(dāng)前函數(shù)結(jié)束時(shí)再次遞歸調(diào)用往下逐列循環(huán)探索,其他棋盤(pán)狀態(tài)同理不一一繪制(下同)。因此,從圖4的圖形變化推理,筆者找到函數(shù)遞歸調(diào)用的位置和要求—放置在函數(shù)體的最后,函數(shù)參數(shù)傳遞變化還是像原來(lái)那樣對(duì)行號(hào)的值加一處理(算法在圖2的偽代碼基礎(chǔ)修改),但是程序不能無(wú)限往下探索,從圖4的棋盤(pán)狀態(tài)可得行號(hào)最大是3,也就是需要增加遞歸結(jié)束條件:行號(hào)累加后不能超過(guò)3。繼續(xù)觀察圖4的變化可知,還需增加檢測(cè)放置皇后的數(shù)量的變量:count= count﹢1,達(dá)到要求的數(shù)量輸出并返回,放完后為了不影響后面的探索,需對(duì)這變量回溯:count= count-1。
4 結(jié)語(yǔ)
筆者最初編寫(xiě)八皇后算法時(shí),運(yùn)用常用的數(shù)學(xué)邏輯編程思維,尚且能解決,但到了任意皇后及其拓展問(wèn)題,感覺(jué)程序執(zhí)行的方向性難以把握,各變量的數(shù)值變化難以推理。通過(guò)轉(zhuǎn)變思路,使用作圖、圖形轉(zhuǎn)換、輔助線(xiàn)、圖形推理時(shí)恍然大悟,使復(fù)雜的事情變得簡(jiǎn)單化了;感覺(jué)能看到程序運(yùn)行全過(guò)程,并能捕捉到某一時(shí)刻的變量的變化,有點(diǎn)像在做建筑設(shè)計(jì)或機(jī)械設(shè)計(jì)。筆者拋磚引玉,引起大家去摸索圖像思維在教研中的作用,促進(jìn)技能人才的培養(yǎng)和就業(yè),同時(shí)提出解決問(wèn)題的另一種思路。
[參考文獻(xiàn)]
[1]嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)C語(yǔ)言版[M].北京:清華大學(xué)出版社,2007.