洛谷 - P1141 - 01迷宮 - dfs
阿新 • • 發佈:2019-04-05
bit scan pan set esp main memset 一次 標記
https://www.luogu.org/problemnew/show/P1141
能互相到達的格子的答案自然是一樣的,第一次dfs標記聯通塊,第二次dfs把cnt傳遞到整個聯通卡並順手消除vis標記(其實把vis標記改成另一個也可以的)。
#include<bits/stdc++.h> using namespace std; #define ll long long int n,m; int g[1005][1005]; int ans[1005][1005]; int cnt=0; int vis[1005][1005]; void dfs(int r,int c){//printf("%d %d\n",r,c); vis[r][c]=1; cnt++; if(r-1>=1&&vis[r-1][c]==0&&g[r][c]!=g[r-1][c]) dfs(r-1,c); if(r+1<=n&&vis[r+1][c]==0&&g[r][c]!=g[r+1][c]) dfs(r+1,c); if(c-1>=1&&vis[r][c-1]==0&&g[r][c]!=g[r][c-1]) dfs(r,c-1); if(c+1<=n&&vis[r][c+1]==0&&g[r][c]!=g[r][c+1]) dfs(r,c+1); } void dfs2(int r,int c){ vis[r][c]=0; ans[r][c]=cnt; if(r-1>=1&&vis[r-1][c]) dfs2(r-1,c); if(r+1<=n&&vis[r+1][c]) dfs2(r+1,c); if(c-1>=1&&vis[r][c-1]) dfs2(r,c-1); if(c+1<=n&&vis[r][c+1]) dfs2(r,c+1); } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%1d",&g[i][j]); //printf("%d!\n",g[i][j]); } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(ans[i][j]==0){ cnt=0; //memset(vis,0,sizeof(vis)); dfs(i,j); dfs2(i,j); } } } for(int i=1;i<=m;i++){ int r,c; scanf("%d%d",&r,&c); printf("%d\n",ans[r][c]); } }
洛谷 - P1141 - 01迷宮 - dfs