洛谷P1141 01迷宮 經典 Dfs + 記憶化搜尋,並查集
阿新 • • 發佈:2018-12-18
將方向用自定義陣列迴圈化 ,讀入時注意字串處理,走過的地方記憶化。並查集,不同聯通塊採用不同顏色標記記憶,方便多次查詢。並記憶每種顏色染色數量(即聯通塊大小)。
#include<cstdio> #include<cmath> #include<cstring> #include<ctime> #include<iostream> #include<algorithm> using namespace std; const int N=1005; char map[N][N]; int n,m,tot; int ans[N*N],f[N][N]; int X[4]={0,0,-1,1}; int Y[4]={-1,1,0,0}; bool ask(int x,int y){ if(!x||!y||x>n||y>n||f[x][y]) return 0; return 1; } void Dfs(int x,int y){ f[x][y]=tot; ans[tot]++; for(int i=0;i<4;i++){ int l=x+X[i]; int r=y+Y[i]; if(map[x][y]!=map[l][r]&&ask(l,r)) Dfs(l,r); } } int main(){ freopen("p1141.in","r",stdin); // freopen("p1141.out","w",stdout); scanf("%d %d\n",&n,&m); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%c",&map[i][j]); } scanf("\n"); } for(int i=1;i<=m;i++){ int x,y; scanf("%d %d\n",&x,&y); if(!f[x][y]) { tot++; Dfs(x,y); } printf("%d\n",ans[f[x][y]]); } fclose(stdin); // fclose(stdout); return 0; }