E - Igor In the Museum 連通塊dfs思維

傳送門
思路:每個連通塊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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章