題目描述:
有乙個由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 與 分治思想 有些相似,都是利用將問題分 為子問題,並通過合併子問題的解來獲得整個問題的解。於 分治 的不同之處在 於,對於乙個相同的子問題動態規劃演算法不會計算第二次,其實現原理是將每乙個計算過的子問題的值儲存在乙個表...