藍(lán)橋杯學(xué)習(xí)——方格分割
一、解題思路
?題目為如圖1所示的6×6網(wǎng)格,需要將其分為完全相同的兩部分。開始我想到從某個角開始分割,嘗試無果后,得知可以用深搜。將網(wǎng)格線從上到下,從左到右標(biāo)號為0~6。從(3,3)點觀察發(fā)現(xiàn),兩邊區(qū)域呈中心對稱,故可以通過深搜一邊得到兩邊都分割好的結(jié)果。由于中心對稱且搜索時向上向下向左向右都會進(jìn)行搜索,有一些結(jié)果會重合,比如一直向上搜索和一直向下搜索,所以最終結(jié)果要除以4。

二、深搜思路
本題不同于數(shù)據(jù)結(jié)構(gòu)中學(xué)過的簡單深度搜索遍歷,課中利用鄰接矩陣或者鄰接表實現(xiàn)搜索,這里用坐標(biāo)加一減一來實現(xiàn)遍歷,通過visit數(shù)組來確認(rèn)是否走過這一格點(需要注意,在每次深搜的末尾,需要將visit數(shù)組置零,因為從一個格點走向另一個格點有不同的走法(詳情可看圖二),如果不清零搜索回到前置格點后,則無法記錄另一種走法得到的遍歷結(jié)果)。

了解這些后開始寫搜索代碼我們在每次搜索時都會進(jìn)行向上、向下,向左和向右的遞歸搜索并且將此時搜索到的點的visit數(shù)組置一,代表已經(jīng)走過了(但并不是不會再走了,而是指在本次搜索路徑中,這個格點已經(jīng)走過了)并且在向四個方向都搜索過之后將visit數(shù)組置零(意思是回到之前的格點,這個格點又可以走了)。代碼如下
遞歸肯定有返回,我們在所有方向都搜索了一遍后返回,還有一個返回點時在深搜函數(shù)開頭:如果搜索到了邊界,那么就代表分割完成了,也要返回。代碼如下
三、main函數(shù)
主要是要想到深度搜索,main函數(shù)中倒是很簡單。由于visit是二維數(shù)組,所以要手動初始化,這里采用了最基礎(chǔ)的方法雙重for循環(huán)。然后在深搜之后,就可以輸出答案啦。
四、完整代碼
五、遇到的問題
開始的時候?qū)isit數(shù)組置一寫到了邊界返回的前面,這樣導(dǎo)致邊界點visit置一后沒有置零直接返回了,下一次搜索就不會再次進(jìn)行到這個邊界點了
六、參考資料
https://blog.csdn.net/shmily_ke/article/details/122567442

第一次寫,有什么問題請盡管且一定提,謝謝大家?。。?!