01迷宮(BFS解法)

2021-10-03 17:19:57 字數 3056 閱讀 5905

題目描述

有乙個僅由數字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...