題目描述
有乙個僅由數字0與1組成的 n×n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。
你的任務是:對於給定的迷宮,詢問從某一格開始能移動到多少個格仔(包含自身)。
輸入格式
第11行為兩個正整數n,m。
下面n行,每行n個字元,字元只可能是0或者1,字元之間沒有空格。
接下來m行,每行2個用空格分隔的正整數i,j,對應了迷宮中第i行第j列的乙個格仔,詢問從這一格開始能移動到多少格。
輸出格式
m行,對於每個詢問輸出相應答案。
輸入輸出樣例
輸入2 2
0110
1 12 2輸出4
4說明提示
所有格仔互相可達。
對於20%20%的資料,n≤n≤10;
對於40%40%的資料,n≤n≤50;
對於50%50%的資料,m≤m≤5;
對於60%60%的資料,n≤100,m≤100≤100,m≤100;
對於100%100%的資料,n≤1000,m≤n≤1000,m≤100000。
這道題我寫了三種解法:
第一版:有m種輸入,每輸入一次就去查詢一次,我們的資料最大達到100000種,肯定會超時,所以這種解法只能通過%70;
#include
#include
#include
using namespace std;
char mp[
1005][
1005];
int n,m;
bool vis[
1006][
1005];
int a[
1000010];
int vir[4]
[2]=
,,,}
;bool in
(int x,
int y)
struct node};
intbfs
(int x,
int y)if(
!vis[tx]
[ty]
&&in
(tx,ty)
&&mp[xx]
[yy]
!=mp[tx]
[ty])}
s.pop();
}return sum+1;
}int
main()
int x,y,k=0;
for(
int i=
0;i)for
(int i=
0;i)return0;
}
第二版,將陣列換成了vector陣列,沒有從根本上解決問題也不能ac但是還是分享一下:
#include
#include
#include
#include
#include
#include
using
namespace std;
vector mp[
1005];
int n,m;
bool vis[
1005][
100005];
int a[
1000005];
int vir[4]
[2]=
,,,}
;boolin(
int x,
int y)
struct node};
intbfs
(int x,
int y)if(
!vis[tx]
[ty]
&&in
(tx,ty)
&&mp[xx]
[yy]
!=mp[tx]
[ty])}
s.pop();
}return sum+1;
}int
main()
for(
int i=
0;i)int x,y,k=0;
for(
int i=
0;i)for
(int i=
0;i)return0;
}
第三版也就是ac版,其實我們可以在地圖上首先尋找所有的聯通快,並且將每個聯通塊的格仔個數記錄下來,需要求解時我們直接詢問此處聯通塊的數量即可。
#include
#include
#include
using
namespace std;
char mp[
1005][
1005];
//存放地圖
int n,m,color=0;
bool vis[
1006][
1005];
//標記有沒有訪問過,以及聯通塊編號
int a[
1000010];
//存放每組聯通塊的格仔個數
int vir[4]
[2]=
,,,}
;boolin(
int x,
int y)
struct node};
intbfs
(int x,
int y)if(
!vis[tx]
[ty]
&&in
(tx,ty)
&&mp[xx]
[yy]
!=mp[tx]
[ty])}
sum++
;//對應編號聯通塊格仔數加一
s.pop();
}return sum;
}int
main()
for(
int i=
1;i<=n;i++)}
}for
(int i=
1;i<=m;i++
)return0;
}
迷宮 二 計蒜客 BFS解法
題目 蒜頭君在你的幫助下終於逃出了迷宮,但是蒜頭君並沒有沉浸於喜悅之中,而是很快的又陷入了思考,從這個迷宮逃出的最少步數是多少呢?輸入格式 第一行輸入兩個整數 n 和 m,表示這是乙個 n m 的迷宮。接下來的輸入乙個 n 行 m 列的迷宮。其中 s 表示蒜頭君的位置,表示牆,蒜頭君無法通過,表示路...
杭電1728逃離迷宮解法二 BFS 搜尋
特別注意 走過的點絕不可以標記,原因 如圖三點1,2,3,假設1轉彎數為5方向向下,2的轉彎數為6方向向右,假設此時點2在隊頭,點2先搜到點3,如果把3標記,點3的轉彎數為6,點1不能搜到點3,導致點3的轉彎數不是最小。include includeusing namespace std const...
迷宮問題bfs
迷宮問題 採用佇列的廣度優先遍歷 bfs 思想是從乙個頂點v0開始,輻射狀地優先遍歷其周圍較廣的區域 找到的解為最優解 include define m 8 define n 8 define maxsize 1000 typedef struct box typedef struct qutype...