http://codeforces.com/problemset/problem/598/D
分析:BFS,同一连通区域的周长一样,但查询过多会导致TLE,所以要将连通区域的答案储存,下次查询到该连通区域就可以直接得出结果
1 #include<iostream> 2 #include<sstream> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<string> 6 #include<cstring> 7 #include<algorithm> 8 #include<functional> 9 #include<iomanip> 10 #include<numeric> 11 #include<cmath> 12 #include<queue> 13 #include<vector> 14 #include<set> 15 #include<cctype> 16 const double PI = acos(-1.0); 17 const int INF = 0x3f3f3f3f; 18 const int NINF = -INF - 1; 19 typedef long long ll; 20 #define MOD 1000007 21 using namespace std; 22 typedef pair<int, int> P; 23 char map[1005][1005]; 24 int n, m, ans, cnt; 25 int x, y; 26 int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1}; 27 int vis[1005][1005]; 28 int num[1000025]; 29 void bfs() 30 { 31 int i, j; 32 queue<P> q; 33 q.push(P(x, y)); 34 cnt++; 35 vis[x][y] = cnt; 36 ans = 0; 37 while (q.size()) 38 { 39 P temp = q.front(); 40 q.pop(); 41 ans += 4; 42 for (i=0; i < 4; ++i) 43 { 44 int nx = temp.first + dx[i]; 45 int ny = temp.second + dy[i]; 46 if (nx >= 0 && nx < n && ny >= 0 && ny < m) 47 { 48 if(map[nx][ny] == '.') 49 { 50 ans--; 51 if(!vis[nx][ny]) 52 { 53 q.push(P(nx, ny)); 54 vis[nx][ny] = cnt; 55 } 56 } 57 } 58 else 59 ans--; 60 } 61 } 62 num[cnt] = ans; 63 cout << ans << endl; 64 } 65 66 int main() 67 { 68 int i, j, k; 69 cin >> n >> m >> k; 70 for (i = 0; i < n; ++i) 71 cin >> map[i]; 72 memset(num, -1, sizeof(num)); 73 memset(vis, 0, sizeof(vis)); 74 cnt = 0; 75 while (k--) 76 { 77 cin >> x >> y; 78 x--, y--; 79 if (vis[x][y] == 0) 80 bfs(); 81 else 82 cout << num[vis[x][y]] << endl; 83 } 84 return 0; 85 }