hdu 1175 連連看 搜尋
連連看
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 44857 Accepted Submission(s): 11211
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
連結:http://acm.hdu.edu.cn/showproblem.php?pid=1175
memset的標頭檔案 #include<cstring>
記錄每一個點的座標,方向,步數,如果這次的方向和上次的不一樣就加1(相當於拐彎),大於2就剪掉,因為每個點又可能來自不同的點即方向不一樣,不能使用簡單的true和false標記,vis裡面應該存步數的值,初始化INF(比2大就行了),每次只允許比vis[x][y]小於等於的點加入佇列
細節:codeblocks int bfs()函式沒有最後的return 0;不報錯= =
while(scanf("%d%d",&n,&m),(n+m)){} 這樣結束迴圈不錯
#include<iostream>
#include<cstdio>
#include<algorithm>
#include <sstream>
#include <cmath>
#include <vector>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
int n,m,T;
int ch[1005][1005];
int vis[1005][1005];
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
struct node{
int x,y,dir,step;//記錄方向,步數
};
int bfs(int x1,int y1,int x2,int y2){
queue<node> q;
node s,temp;
s.x = x1;
s.y = y1;
s.step = 0;
s.dir = -1;
q.push(s);
while(!q.empty()){
temp = q.front();
q.pop();
if(temp.x==x2 && temp.y==y2 && temp.step<=2)
return 1;
for(int i=0;i<4;i++){
s = temp;
s.x+=dx[i];
s.y+=dy[i];
if(s.x<1 || s.y<1 || s.x>n || s.y>m)
continue;
if(ch[s.x][s.y]==0 || (s.x==x2 && s.y==y2)){
if(s.dir!=-1){
if(s.dir!=i){
s.dir = i;
s.step++;
}
}else
s.dir = i;
if(s.step > 2)
continue;
if(s.step<=vis[s.x][s.y]){
vis[s.x][s.y] = s.step;
q.push(s);
}
}
}
}
return 0;
}
int main(){
while(~scanf("%d%d",&n,&m)){
if(n==0)
break;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>ch[i][j];
scanf("%d",&T);
while(T--){
memset(vis,10,sizeof(vis));//1也行
int x1,y1,x2,y2,ans;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(!ch[x1][y1] || !ch[x2][y2] || ch[x1][y1]!=ch[x2][y2] || (x1==x2 && y1==y2))
ans=0;
else
ans = bfs(x1,y1,x2,y2);
if(ans)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
return 0;
}
相關文章
- HDU 4620 Fruit Ninja Extreme(搜尋)UIREM
- HDU1560,迭代加深搜尋
- hdu 1728 逃離迷宮 搜尋
- HDU 6415(dp/記憶化搜尋)
- nodejs 實現 磁力連結資源搜尋 BT磁力連結爬蟲NodeJS爬蟲
- bt引擎-螞蟻磁力搜尋教程大全,如何使用搜尋引擎查詢磁力連結
- 恕我直言,你可能連 GitHub 搜尋都不會用 - 如何精準搜尋的神仙技巧Github
- 《天天連連看》隱私策略
- 關於google搜尋欄首字母粘連問題Go
- HDU 6058 Kanade's sum(連結串列)
- Java遊戲開發——連連看Java遊戲開發
- c#(WPF)實現連連看C#
- 網路卡-熱點搜尋不到或者無法連線問題
- LeetCode 109——有序連結串列轉化二叉搜尋樹LeetCode
- 《連連看》走過的這些年
- 【連結串列問題】打卡10:將搜尋二叉樹轉換成雙向連結串列二叉樹
- LeetCode-109-有序連結串列轉換二叉搜尋樹LeetCode
- LeetCode系列之「有序連結串列轉換二叉搜尋樹」LeetCode
- JZ-026-二叉搜尋樹與雙向連結串列
- 【180620】VC++連連看遊戲原始碼C++遊戲原始碼
- 尋找連續或不連續的子字串字串
- 百度搜尋:藍易雲【SSH遠端直連Docker容器教程。】Docker
- PTA 天梯賽備賽 L1-006 連續因子 (20 分)(搜尋)
- 面試題36:二叉搜尋樹與雙向連結串列面試題
- 共享庫連結和載入時的路徑搜尋優先順序
- Python演算法練習--把搜尋樹轉成雙向連結串列Python演算法
- 編譯期連結時共享庫搜尋路徑優先順序實驗編譯
- 程式設計師玩連連看的正確姿勢程式設計師
- HDU 2612 Find a way (廣搜)
- 最佳路徑搜尋(二):啟發式搜尋(代價一致搜尋(Dijkstra search),貪心搜尋,A*搜尋)
- 海量資料搜尋---搜尋引擎
- 虛擬機器:GCC共享庫在連線時的搜尋位置和優選次序虛擬機GC
- Windows 10新版本成噩夢:IME、桌面搜尋、Defender問題接連不斷!Windows
- Python 圖_系列之基於<連結表>實現無向圖最短路徑搜尋Python
- 466. 使用快慢指標把有序連結串列轉換二叉搜尋樹指標
- 什麼是搜尋引擎更新頻次?怎麼看?
- 搜尋
- 搜尋引擎-03-搜尋引擎原理