HDU-1241 Oil Deposits
来源:互联网 发布:手机版的java api 编辑:程序博客网 时间:2024/05/23 23:22
题意:'@'表示油田,'*'表示墙,问n*m的地图上有几块油田?↑↓←→↖↙↗↘八个方向相连算同一块油田。
思路:BFS或DFS求连通块。遍历整个图每找到一次'@',进行一次BFS把油田改为'*',答案++。
#include<bits/stdc++.h>using namespace std;int n, m, dir[8][2] = {{1, 0}, {0, 1}, {0, -1}, {-1, 0}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};char MAP[105][105];pair<int, int> NOW;void bfs(int sx,int sy){ queue<pair<int, int> > q; q.push(make_pair(sx, sy)); while (!q.empty()) { NOW = q.front(); q.pop(); for (int i = 0; i < 8; i++) { int X = NOW.first + dir[i][0], Y = NOW.second + dir[i][1]; if (X >= 0 && Y >= 0 && X < n && Y < m && MAP[X][Y] == '@') { MAP[X][Y] = '*'; q.push(make_pair(X, Y)); } } }}int main(){ while (~scanf("%d%d", &n, &m) && (n + m)) { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> MAP[i][j]; } } int ans = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (MAP[i][j] == '@') { bfs(i, j); ans++; } } } printf("%d\n",ans); } return 0;}/*1 1*3 5*@*@***@***@*@*1 8@@****@*5 5****@*@@*@*@**@@@@*@@@**@0 0*/
阅读全文