01迷宮(記憶化搜尋)

2021-07-23 10:48:02 字數 1376 閱讀 6875

題目描述:

有乙個由01組成的n*n格迷宮,若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。那麼對於給定的迷宮,詢問從某一格開始能移動到多少格。

輸入描述:

輸入的第1行為兩個正整數n,m。

下面n行,每行n個字元,字元只可能是0或者1,字元之間沒有空格。

接下來m行,每行2個用空格分隔的正整數i,j,對應了迷宮中第i行第j列的乙個0,詢問從這一格開始能移動到多少格。

輸出描述:

輸出包括m行,對於每個詢問輸出答案。

樣例輸入:

2 2

01 10

1 1

2 2

樣例輸出:

樣例說明:

所有格仔互相可達。

資料規模:

對於20%的資料,n≤10;

對於40%的資料,n≤50;

對於50%的資料,m≤5;

對於60%的資料,n≤100,m≤100;

對於100%的資料,n≤1000,m≤1000000。

思路:

因為有多個查詢,為了減少不必要的搜尋,使用記憶化搜尋

#include

#include

#include

using

namespace

std;

const

int maxn=1010;

int n,m,map[maxn][maxn],me[maxn][maxn];

int xx[5]=,

yy[5]=;

char s[maxn];

struct node

a;struct tong

b[maxn*maxn];

bool flag[maxn][maxn];

queue

q;void search(node a)

int cnt=0;

q.push(a);

while(!q.empty())}}

for(int i=1;i<=cnt;i++)

me[b[i].x][b[i].y]=cnt;

if(cnt==0) cnt++;

printf("%d\n",cnt);

}int main()

for(int i=1;i<=m;i++)

return

0;}

記憶化搜尋

演算法上依然是搜尋的流程,但是搜尋到的一些解用 動態規劃 的那種思想和模式作一些儲存。一般說來,動態規劃總要遍歷所有的狀態,而搜尋可以排除一些無效狀態。更重要的是搜尋還可以剪枝,可能剪去大量不必要的狀態,因此在空間開銷上往往比動態規劃要低很多。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求...

記憶化搜尋

記憶化搜尋 演算法上依然是搜尋的流程,但是搜尋到的一些解用動態規劃的那種思想和模式作一些儲存。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求解乙個狀態,就將它的解儲存下來,以後再次遇到這個狀態的時候,就不必重新求解了。例1.題目描述 給從左至右排好隊的小朋友們分糖果,要求 1.每個小朋友都...

記憶化搜尋

原文 感謝作者。一.動態規劃 動態規劃 dynamic programming 與 分治思想 有些相似,都是利用將問題分 為子問題,並通過合併子問題的解來獲得整個問題的解。於 分治 的不同之處在 於,對於乙個相同的子問題動態規劃演算法不會計算第二次,其實現原理是將每乙個計算過的子問題的值儲存在乙個表...