P1141 01迷宫
题目链接-P1141 01迷宫
解题思路
dfs求连通块+记忆化,如果不记忆化会TLE
- 每一次搜索会找到一个区块,该区块中所有点的答案都相同,所以答案可以用数组 f[N][N]记录
- 对于题目要求查询的每一个点先判断是否前面搜索时已经得到答案,如果是则存入ans[]数组中,以便最后输出,如果不是则进行dfs深搜
- 其他都跟dfs的板子一样,不再做讲解,具体操作见代码
附上代码
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
using namespace std;
const int INF=0x3f3f3f3f;
const int dir[4][2]={-1,0,1,0,0,-1,0,1};
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=1e6+5;
typedef long long ll;
typedef pair<int,int> PII;
int n,m,f[1010][1010],ans[N];
char mp[1010][1010];
void dfs(int x,int y,char c,int it){
if(x<1||y<1||x>n||y>n||f[x][y]!=-1)
return ;
f[x][y]=it;
ans[it]++;
for(int i=0;i<4;i++){
int dx=x+dir[i][0];
int dy=y+dir[i][1];
if(mp[dx][dy]!=c)
dfs(dx,dy,mp[dx][dy],it);
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>mp[i]+1;
memset(f,-1,sizeof f);
for(int i=0;i<m;i++){
int x,y;
cin>>x>>y;
if(f[x][y]!=-1)
ans[i]=ans[f[x][y]];
else
dfs(x,y,mp[x][y],i);
}
for(int i=0;i<m;i++)
cout<<ans[i]<<endl;
return 0;
}