第一百一十章 優(yōu)化
孟響開(kāi)始奮筆疾書(shū)。他感覺(jué),如果用鍵盤(pán),他寫(xiě)代碼的速度只是一般,畢竟手速跟不上腦子。但是用筆,他僅僅用了3分鐘,就擼出了第一個(gè)版本的主體函數(shù)。當(dāng)然,這只是八皇后主體程序。
八個(gè)for循環(huán)鼎立在前方,他有百分百的把握,只要寫(xiě)完,這個(gè)解法一定是正確的。
只是他遇到了一個(gè)難題。
如果N不是定值時(shí),他不知道要寫(xiě)幾個(gè)for。
如果N是10,他就是10個(gè)for循環(huán)……
“這個(gè)就是,8個(gè)循環(huán)嵌套,百分百能求出來(lái),但是如果是N皇后……”孟響說(shuō)著說(shuō)著,聲音小了下去。
“哥哥!你怎么能用這么笨的方法。”孟夢(mèng)看到哥哥寫(xiě)好的主體,有些哭笑不得。這種8個(gè)for,計(jì)算量完全就是指數(shù)形式的,屬于所有方法中時(shí)間最慢,消耗資源最多的方法。
孟響有些尷尬的摸了摸腦袋,時(shí)間太短了,他也沒(méi)法一下想的那么全。
“那…換一種,反正這個(gè)的N皇后版本我也不知道怎么改?!泵享懺趯?xiě)8個(gè)for循環(huán)時(shí),腦中已經(jīng)有了一定雛型,翻過(guò)一頁(yè)紙后,就繼續(xù)開(kāi)始寫(xiě)起了第二版。
“先對(duì)每一行的每一列進(jìn)行探測(cè),看是否能放置皇后,如果可以,就在這一列放一個(gè)皇后,然后行數(shù)加一。然后繼續(xù)探測(cè)下一行的皇后位置。”孟夢(mèng)在旁邊提醒道。
孟響一邊點(diǎn)頭,一邊飛快的開(kāi)始寫(xiě)主體函數(shù)。
“是不是如果已經(jīng)探測(cè)完所有的列都沒(méi)有找到可以防止皇后的列,就可以回溯了?”孟響抓住一點(diǎn)思路,下意識(shí)問(wèn)道,問(wèn)的同時(shí),手上的筆一直沒(méi)停。
“嗯!回溯之后,把上一行的皇后位置往后移一列——”
“如果上一行的皇后也找不到位置,那么應(yīng)該就繼續(xù)往前回溯,直至前方某一行找到皇后的位置能移動(dòng),或者回到第一行!”孟響接話道,他思路一下子清晰了。“如果回到第一行,也無(wú)法找到可以放置皇后的位置,那就表示所有的解都已經(jīng)找到。”
“哥哥真聰明?!甭?tīng)到哥哥的話,孟夢(mèng)的大眼睛瞇成了月牙兒。她繼續(xù)說(shuō)道:“同時(shí),如果一直不用回溯,找到最后一行放置皇后,就表示已經(jīng)找到一個(gè)結(jié)果?!?p> “明白了,因?yàn)橐业氖撬械慕?,那么,找到了一個(gè)結(jié)果后不能直接結(jié)束程序,程序應(yīng)該在第一行無(wú)法找到放置皇后的位置時(shí)結(jié)束。而找到一個(gè)結(jié)果后,應(yīng)該清除掉,然后在剛剛放皇后的下一列開(kāi)始探測(cè)。”
孟響嘴里念念叨叨,腦中飛速運(yùn)轉(zhuǎn),手上書(shū)寫(xiě)的速度更是沒(méi)有絲毫停頓和放緩,白紙上飛快出現(xiàn)一行行代碼。有了孟夢(mèng)的助力,孟響很快就寫(xiě)完大部分程序。這次,他的循環(huán)一下精簡(jiǎn)到了兩個(gè)while,和剛剛8個(gè)for簡(jiǎn)直有著天差地別。
這次,他僅僅用了5分鐘,就寫(xiě)好了3個(gè)函數(shù)。
在手寫(xiě)代碼的速度上,他有著無(wú)與倫比的優(yōu)勢(shì)。別人都是受限于思考速度,必須一邊停筆理順?biāo)悸芬贿厡?xiě),而他則不被這個(gè)問(wèn)題困擾。即便是妹妹,也絕對(duì)沒(méi)有他這種快槍手的速度……
“還有10分鐘才結(jié)束,哥哥真厲害?!泵蠅?mèng)看著哥哥滿滿地寫(xiě)了一大版,既驚嘆哥哥書(shū)寫(xiě)代碼的速度,又驚嘆哥哥非凡的思考速度和理解能力。
哥哥果然和自己一樣,也是很聰明的孩子!
“我們一起來(lái)過(guò)一遍,我來(lái)說(shuō)每個(gè)地方的用處,你來(lái)幫我把把關(guān)?!泵享懘笾聮吡艘谎鄢绦颉?p> 孟夢(mèng)點(diǎn)了點(diǎn)頭,一邊聽(tīng)著哥哥解釋程序的邏輯,一邊開(kāi)始判斷邏輯的正確性以及是否能優(yōu)化。
……
“二維數(shù)組改成一維數(shù)組,數(shù)組下標(biāo)表示行,數(shù)組元素表示列,這樣能節(jié)省內(nèi)存!”高三那名集訓(xùn)隊(duì)的學(xué)長(zhǎng)眼前一亮,思如泉涌??戳丝磿r(shí)間,他立馬開(kāi)始寫(xiě)起了第二版的程序。
……
“遞歸算法的話,先天弱了一些,那么……”高二“漂亮”男生努力觀想自己女裝的畫(huà)面,只有這樣,他才能提高一點(diǎn)自己的思考能力和思維活躍度。
突然,他腦中蹦出了一個(gè)題目。
猴子選大王!
“需要有個(gè)數(shù)據(jù)結(jié)構(gòu)能夠動(dòng)態(tài)的刪除掉已經(jīng)有的值!”他喃喃自語(yǔ)道,顯得神神叨叨的。
“你怎么了?”女生看他一臉茫然,奇怪的問(wèn)道。
“我怎么了……”說(shuō)到這,男生眼前一亮,猛地拿起一支筆來(lái):“遞歸也是可以?xún)?yōu)化的,我們應(yīng)該用鏈表試試?!闭f(shuō)道這,他立馬在草稿紙上開(kāi)始畫(huà)起了模型圖。
……
“遞歸方法寫(xiě)出來(lái)了,有什么辦法能繼續(xù)優(yōu)化嗎?”小胖子叼著筆,皺著眉仔細(xì)思索,他完全是一個(gè)人在戰(zhàn)斗。而其他三人眼巴巴地看著他這位NOIP拿580分的大高手。
這三個(gè)家伙是指望不上了,就算他們能理解程序,也不能立馬給自己建議。
“N*N的棋盤(pán)……”小胖子的思維以不符合他體型慣性的速度開(kāi)始旋轉(zhuǎn)。
那么……
想到這,小胖子直接爆了個(gè)粗口:“臥槽!”
另外嗷嗷待哺地三人嚇了一跳。
“怎么了,文斌?!逼渲幸晃慌÷晢?wèn)道,這會(huì)兒,小胖子就是她的男神。
當(dāng)然,只是這30分鐘而已。
聽(tīng)到“文斌”兩個(gè)字,小胖子節(jié)操碎了一地,連雞皮疙瘩都起了不少,在他眼里,參加信息競(jìng)賽的都是哥們,這么叫他…不能忍!
“N*N的棋盤(pán),不就是正方形嘛,那特么不就是對(duì)稱(chēng)嘛,我……得趕緊改下程序,還能優(yōu)化點(diǎn)?!毙∨肿余?,他看了看時(shí)間,整個(gè)人抖了一抖,連忙開(kāi)始寫(xiě)第二版的代碼。
其他三人在旁邊給他鼓氣……
原來(lái),一神帶三坑是這種滋味。
他一邊寫(xiě),一邊在心里默默想道。
……
“大概就是這樣了?!泵鎸?duì)孟夢(mèng)這種學(xué)生,孟響飛快地就解釋完了所有的程序,孟夢(mèng)也迅速理解了其中的邏輯。
在她看來(lái),這些東西的邏輯還是很簡(jiǎn)單的。
“那,哥哥,我想到一個(gè)方法,你看看能不能試一下?!泵蠅?mèng)琢磨了一會(huì)兒,有些不好意思地說(shuō)道:“既然數(shù)組有下標(biāo),那么不用矩陣…不,二維數(shù)組,試試能不能用一維數(shù)組,下標(biāo)來(lái)表示列,下標(biāo)0就是第一列!這個(gè)哥哥能寫(xiě)嘛?”
聽(tīng)到妹妹的提醒,孟響眼前一亮。