傳送門
思路:每個連通塊dfs一次,並記錄所在連通塊的Value。這樣就做了一次剪枝。
代碼:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char G[1005][1005];
int vis[1005][1005];
int cnt[100005];
int n, m;
void dfs(int x, int y, int ans)
{
if(vis[x][y] || x < 1 || x > n || y < 1 || y > m || G[x][y] == '*')
return ;
vis[x][y] = ans;
if(G[x][y + 1] == '*')
cnt[vis[x][y]]++;
if(G[x][y - 1] == '*')
cnt[vis[x][y]]++;
if(G[x + 1][y] == '*')
cnt[vis[x][y]]++;
if(G[x - 1][y] == '*')
cnt[vis[x][y]]++;
dfs(x, y + 1, ans);
dfs(x + 1, y, ans);
dfs(x, y - 1, ans);
dfs(x - 1, y, ans);
}
int main()
{
int k;
scanf("%d %d %d",&n, &m, &k);
for(int i = 1;i <= n;i++)
for(int j = 1;j <= m;j++)
cin >> G[i][j];
int sum = 0;
while(k--)
{
++sum;
int x, y;
scanf("%d %d",&x, &y);
if(vis[x][y])
cout << cnt[vis[x][y]] << endl;
else
{
dfs(x, y, sum);
cout << cnt[vis[x][y]] << endl;
}
}
return 0;
}