HDUOJ----(1175)連連看
連連看
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14847 Accepted Submission(s): 3880
Problem Description
“連連看”相信很多人都玩過。沒玩過也沒關係,下面我給大家介紹一下游戲規則:在一個棋盤中,放了很多的棋子。如果某兩個相同的棋子,可以通過一條線連起來(這條線不能經過其它棋子),而且線的轉折次數不超過兩次,那麼這兩個棋子就可以在棋盤上消去。不好意思,由於我以前沒有玩過連連看,諮詢了同學的意見,連線不能從外面繞過去的,但事實上這是錯的。現在已經釀成大禍,就只能將錯就錯了,連線不能從外圍繞過。 玩家滑鼠先後點選兩塊棋子,試圖將他們消去,然後遊戲的後臺判斷這兩個方格能不能消去。現在你的任務就是寫這個後臺程式。
Input
輸入資料有多組。每組資料的第一行有兩個正整數n,m(0<n<=1000,0<m<1000),分別表示棋盤的行數與列數。在接下來的n行中,每行有m個非負整數描述棋盤的方格分佈。0表示這個位置沒有棋子,正整數表示棋子的型別。接下來的一行是一個正整數q(0<q<50),表示下面有q次詢問。在接下來的q行裡,每行有四個正整數x1,y1,x2,y2,表示詢問第x1行y1列的棋子與第x2行y2列的棋子能不能消去。n=0,m=0時,輸入結束。 注意:詢問之間無先後關係,都是針對當前狀態的!
Output
每一組輸入資料對應一行輸出。如果能消去則輸出"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
1 #include<cstdio> 2 #include<cstdlib> 3 #include<deque> 4 #include<iostream> 5 #define maxn 1003 6 using namespace std; 7 int map[maxn][maxn]; 8 int hash[maxn][maxn]; 9 unsigned int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; 10 int n,m; 11 struct node 12 { 13 int x,y; 14 int step,tag; 15 }start,end; 16 void save_map() 17 { 18 for(int i=1;i<=n;i++) 19 { 20 for(int j=1;j<=m;j++) 21 { 22 scanf("%d",&map[i][j]); 23 } 24 } 25 } 26 27 void bfs() 28 { 29 int i; 30 deque<node>q; 31 node q1,q2; 32 q.push_back(start); 33 for( i=1;i<=n;i++) 34 { 35 for(int j=1;j<=m;j++) 36 { 37 hash[i][j]=3; 38 } 39 40 } 41 while(!q.empty()) 42 { 43 q1=q.front (); 44 q.pop_front(); 45 for(i=0;i<4;i++) 46 { 47 q2.x=q1.x+dir[i][0]; 48 q2.y=q1.y+dir[i][1]; 49 q2.step=q1.step; 50 q2.tag=q1.tag; 51 if(q2.tag!=i) 52 { 53 q2.step++; 54 q2.tag=i; 55 } 56 if(q2.x==end.x&&q2.y==end.y&&q2.step<=2) 57 { 58 printf("YESn"); 59 return ; 60 } 61 62 63 if(q2.step<3&&q2.x>0&&q2.x<=n&&q2.y>0&&q2.y<=m&&map[q2.x][q2.y]==0) 64 { 65 if(hash[q2.x][q2.y]>=q2.step) 66 { 67 q.push_back(q2); 68 hash[q2.x][q2.y]=q2.step; 69 } 70 } 71 72 } 73 } 74 printf("NOn"); 75 } 76 77 int main() 78 { 79 int t,i; 80 while(scanf("%d%d",&n,&m),n+m) 81 { 82 save_map(); 83 scanf("%d",&t); 84 for(i=0;i<t;i++) 85 { 86 scanf("%d %d %d %d",&start.x,&start.y,&end.x,&end.y); 87 start.step=-1; 88 start.tag=-1; 89 if(map[start.x][start.y]==map[end.x][end.y]&&map[start.x][start.y]!=0) 90 bfs(); 91 else 92 printf("NOn"); 93 } 94 } 95 return 0; 96 }