在一種"麻將"遊戲中,遊戲是在乙個有w*h格仔的矩形平板上進行的。每個格仔可以放置乙個麻將牌,也可以不放(如圖所示)。玩家的目標是將平板上的所有可通過一條路徑相連的兩張相同的麻將牌,從平板上移去。最後如果能將所有牌移出平板,則算過關。
這個遊戲中的乙個關鍵問題是:兩張牌之間是否可以被一條路徑所連線,該路徑滿足以下兩個特性:
1. 它由若干條線段組成,每條線段要麼是水平方向,要麼是垂直方向。
2. 這條路徑不能橫穿任何乙個麻將牌 (但允許路徑暫時離開平板)。
這是乙個例子:
在(1,3)的牌和在(4, 4)的牌可以被連線。(2, 3)和(3, 4)不能被連線。
你的任務是編乙個程式,檢測兩張牌是否能被一條符合以上規定的路徑所連線。
輸入檔案的第一行有兩個整數w,h (1<=w,h<=75),表示平板的寬和高。接下來h行描述平板資訊,每行包含w個字元,如果某格仔有一張牌,則這個格仔上有個』x』,否則是乙個空格。平板上最左上角格仔的座標為(1,1),最右下角格仔的座標為(w,h)。接下來的若干行,每行有四個數x1, y1, x2, y2 ,且滿足1<=x1,x2<=w,1<=y1,y2<=h,表示兩張牌的座標(這兩張牌的座標總是不同的)。如果出現連續四個0,則表示輸入結束。
輸出檔案中,對於每一對牌輸出佔一行,為連線這一對牌的路徑最少包含的線段數。如果不存在路徑則輸出0。
5 4***xx
x ***x x
***2 3 5 3
1 3 4 4
2 3 3 4
0 0 0 043
0這題其實是最小轉彎問題的公升級版,多了一些條件,還涉及到一些字串處理。
這是一道bfs(我就是複製過來的啊 ),也是一條路走到黑之後換方向。
我的a作為儲存陣列,c作為更改陣列(多組資料的原因)。每一次都要memset c。其他的**跟最小轉彎很像,在源程式上改了一下就可以了。
程式中寫了一些要注意的地方。
除錯**也附上了(注釋掉的)
#include
#include
using
namespace std;
int st[
100010][
4];int n,m,qx,qy,zx,zy;
int h,t;
int dx[5]
=;int dy[5]
=;int a[
101]
[101
],c[
101]
[101];
void
bfs()}
h=0;t=1
; st[1]
[1]=qx;st[1]
[2]=qy;st[1]
[3]=
0;//初始化
while
(hif(c[xx]
[yy]==0
)//一定要判斷!能走才入隊!
xx+=dx[i]
;//往前走
yy+=dy[i];}
}}cout<<
0<
//不行輸出0
}int
main()
} cin>>qy>>qx>>zy>>zx;
while
(qx!=
0||qy!=
0||zx!=
0||zy!=0)
// cout/ }
a[zx]
[zy]=1
; cin>>qy>>qx>>zy>>zx;
}return0;
}/*5 4***xx
x x
*** x
***
*/
還往下翻?沒啦! SSL 1786麻將遊戲
time limit 1000ms memory limit 65536k 在一種 麻將 遊戲中,遊戲是在乙個有w h格仔的矩形平板上進行的。每個格仔可以放置乙個麻將牌,也可以不放 如圖所示 玩家的目標是將平板上的所有可通過一條路徑相連的兩張相同的麻將牌,從平板上移去。最後如果能將所有牌移出平板,則...
SSL P1786 麻將遊戲
尋求最短路徑,但可越出平板 暫時性 相對其他的題目來說比較難,但只要處理好一些細節後,便會從複雜到簡單。我絕對不會說出ta是最小轉彎的 公升級版!include include include include define ll long long using namespace std inlin...
SSL P1786 麻將遊戲 題目
麻將遊戲 time limit 10000ms memory limit 65536k total submit 205 accepted 77 case time limit 1000ms description 在一種 麻將 遊戲中,遊戲是在乙個有w h格仔的矩形平板上進行的。每個格仔可以放置乙...