(bfs)连连看(hdu1175)
題目:
“連連看”相信很多人都玩過(guò)。沒(méi)玩過(guò)也沒(méi)關(guān)系,下面我給大家介紹一下游戲規(guī)則:在一個(gè)棋盤(pán)中,放了很多的棋子。如果某兩個(gè)相同的棋子,可以通過(guò)一條線連起來(lái)(這條線不能經(jīng)過(guò)其它棋子),而且線的轉(zhuǎn)折次數(shù)不超過(guò)兩次,那么這兩個(gè)棋子就可以在棋盤(pán)上消去。不好意思,由于我以前沒(méi)有玩過(guò)連連看,咨詢了同學(xué)的意見(jiàn),連線不能從外面繞過(guò)去的,但事實(shí)上這是錯(cuò)的。現(xiàn)在已經(jīng)釀成大禍,就只能將錯(cuò)就錯(cuò)了,連線不能從外圍繞過(guò)。
玩家鼠標(biāo)先后點(diǎn)擊兩塊棋子,試圖將他們消去,然后游戲的后臺(tái)判斷這兩個(gè)方格能不能消去。現(xiàn)在你的任務(wù)就是寫(xiě)這個(gè)后臺(tái)程序。
Input
輸入數(shù)據(jù)有多組。每組數(shù)據(jù)的第一行有兩個(gè)正整數(shù)n,m(0< n<=1000,0< m<1000),分別表示棋盤(pán)的行數(shù)與列數(shù)。在接下來(lái)的n行中,每行有m個(gè)非負(fù)整數(shù)描述棋盤(pán)的方格分布。0表示這個(gè)位置沒(méi)有棋子,正整數(shù)表示棋子的類(lèi)型。接下來(lái)的一行是一個(gè)正整數(shù)q(0 < q<50),表示下面有q次詢問(wèn)。在接下來(lái)的q行里,每行有四個(gè)正整數(shù)x1,y1,x2,y2,表示詢問(wèn)第x1行y1列的棋子與第x2行y2列的棋子能不能消去。n=0,m=0時(shí),輸入結(jié)束。
注意:詢問(wèn)之間無(wú)先后關(guān)系,都是針對(duì)當(dāng)前狀態(tài)的!
Output
每一組輸入數(shù)據(jù)對(duì)應(yīng)一行輸出。如果能消去則輸出”YES”,不能則輸出”NO”。
Sample Input
3 4
1 2 3 4
0 0 0 0
4 3 2 1
4
1 1 3 4
1 1 2 4
1 1 3 3
2 1 2 4
3 4
0 1 4 3
0 2 4 1
0 0 0 0
2
1 1 2 4
1 3 2 3
0 0
Sample Output
YES
NO
NO
NO
NO
YES
分析與解答:
這個(gè)題需要考慮轉(zhuǎn)向,轉(zhuǎn)向的話就是根據(jù)到當(dāng)前數(shù)走的方向與到上個(gè)數(shù)走的方向是否相同來(lái)判斷。如果不同,轉(zhuǎn)彎的數(shù)要加一。現(xiàn)在我們有坐標(biāo),方向轉(zhuǎn)彎次數(shù)就好寫(xiě)了,其中我們認(rèn)為方向0就是向下,1向右,2向上,3向左,-1是最初的x1y1的方向,意味著從他走向下一個(gè)數(shù)是不用考慮轉(zhuǎn)彎的,只用記錄到達(dá)這個(gè)數(shù)的方向
由于他是詢問(wèn)x1y1到x2y2,我們只需判斷是否有x1y1到x2y2的路,這個(gè)題讓我刷新了對(duì)標(biāo)記數(shù)組的認(rèn)識(shí),之前的標(biāo)記數(shù)組都是經(jīng)過(guò)了就變?yōu)榱硪粋€(gè)數(shù),下次在經(jīng)過(guò)這個(gè)坐標(biāo)時(shí)如果已做過(guò)標(biāo)記就不走。但這個(gè)是用于記錄從(x1,y1)到(i,j)轉(zhuǎn)彎的最小次數(shù),如果在(i,j)這個(gè)位置的step<=v[i][j],就push到隊(duì)列里,我試了一下,如果把這個(gè)標(biāo)志數(shù)組去掉就會(huì)超時(shí),就是從起點(diǎn)到一個(gè)點(diǎn)的的路徑有多條,但是如果只是說(shuō)經(jīng)過(guò)了就不再考慮到這個(gè)點(diǎn)的其他路徑的話,這個(gè)點(diǎn)到終點(diǎn)的轉(zhuǎn)彎次數(shù)加上起點(diǎn)到這個(gè)點(diǎn)的轉(zhuǎn)彎次數(shù)會(huì)超過(guò)二,這是不滿足題意的,所以我們到這個(gè)點(diǎn)之后還需要考慮其他到這個(gè)點(diǎn)的路徑,其唯一目的就是讓從起點(diǎn)到終點(diǎn)的路徑轉(zhuǎn)彎的次數(shù)最小,這樣的話,就有極大的可能從這個(gè)路徑一直走到終點(diǎn)的過(guò)程中轉(zhuǎn)彎的次數(shù)滿足題意,所以我們標(biāo)記數(shù)組只存最小或者等于目前最小的轉(zhuǎn)彎次數(shù)的路徑
前面還有個(gè)判斷,如果step比2小,就繼續(xù)搜索,這是題目要求
還有常規(guī)判斷,走一步之后新的坐標(biāo)在范圍內(nèi),新坐標(biāo)這個(gè)位置沒(méi)有棋子,這個(gè)新坐標(biāo)就是我們要找的坐標(biāo) ,滿足這寫(xiě)條件,此時(shí)我們?cè)倏紤]是不是該push了
參考代碼:
https://blog.csdn.net/jzmzy/article/details/16862263
總結(jié)
以上是生活随笔為你收集整理的(bfs)连连看(hdu1175)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java代下订单管理模块_用java语言
- 下一篇: linux自动挂载usb打印机,Linu