洛谷【1101】單詞方陣

給一nXn的字母方陣,內可能蘊含多個“yizhong”單詞。單詞在方陣中是沿着同一方向連續擺放的。擺放可沿着8個方向的任一方向,同一單詞擺放時不再改變方向,單詞與單詞之間[color=red]可以[/color]交叉,因此有可能共用字母。輸出時,將不是單詞的字母用“*”代替,以突出顯示單詞。例如:

輸入:
8 輸出:
qyizhong *yizhong
gydthkjy gy******
nwidghji n*i*****
orbzsfgz o**z****
hhgrhwth h***h***
zzzzzozo z****o**
iwdfrgng i*****n*
yyyygggg y******g
輸入輸出格式

輸入格式:
第一行輸入一個數n。(7<=n<=100)。

第二行開始輸入nXn的字母矩陣。

輸出格式:
突出顯示單詞的nXn矩陣。

輸入輸出樣例

輸入樣例#1:
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
輸出樣例#1:








這是一道深搜的題目,在洛谷題解中很多人用的是枚舉,這裏還是以練習深搜爲主用深搜思路做

分析:
找到y後搜索8個方向,如果(有等於i的繼續沿着這個方向向下搜索看是否繼續與
“yizhong”這個字符串後面的字符相等。如果計數器累計等於7,說明7個字符都相等了。那麼回溯標記數組vis記爲1。) 如果(沒有等於i的換個方向繼續搜索。)
這樣在輸出結果的時候,如果遇見標記數組vis等於1的時候就輸出字符,否則就輸出’*’。

代碼:
Ubuntu鏈接:
http://paste.ubuntu.com/24391322/

運行結果:
*yizhong
gy******
n*i*****
o**z****
h***h***
z****o**
i*****n*
y******g

細節分析(人工debug):
可以看見在第一次時找到y位置爲(0,1)
按照dx[0],dy[0]搜索找到i,於是在此方向上繼續搜索。
(此時f!=-1,應執行下面的那幾句深搜語句
【即在上面第一次f=-1是爲了找方向,下面是找到了方向以後按照這個方向搜索看是否可以記錄下7個字符,如果記錄下來
(在if(s==7)裏回溯標記vis數組,注意此時xx,yy都是同名局部變量,所以儘管回溯到最低時,外面的搜索語句還是在s=7時的xx,yy繼續向下搜索到不滿足條件時
(按照棧的方式,自己回溯))】
可以看見,此時轉到打印出語句:其他1 f0 xx 0 yy 8到達搜索邊界,回溯調用棧
一直回溯到打印出語句:第一次後 f 0 xx 0 yy 2(回到線性搜索最初i的位置)
繼續搜索其他方向,可以看見打印出語句如:第一次前 f 1 xx 0 yy 0等等
在第一次搜索中其他7個方向均沒有滿足條件的,因此在打印出語句如下:
f 7 xx -1 yy 0後就退出本次搜索了。
(但是我一直有個疑問:那些搜索里加的return;語句是什麼用啊)
)
1
其他幾個位置的y搜索方法類似,圖分別如下
2:
2
3:
3
4:
4
5:
5
6:
6
7:
7

引用塊內容參考文章:http://m.blog.csdn.net/article/details?id=48650439

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章