Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 26944 | Accepted: 14637 |
Description
Input
Output
Sample Input
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
Sample Output
45 59 6 13
/*题目大意:在一个矩形房间里,里面填满着红砖与黑砖,每次走动只能走黑砖位置,而不能走红砖, * 可以上下左右四个方向走动,现在初始位置在黑砖位置上,试问从此黑砖位置开始能够到达的砖的数量是多少 *算法分析:从起始位置开始四个方向进行dfs,若遇到红砖位置则将此砖块换为黑砖。换砖的次数即为到达的黑砖数量 */ #include <iostream> #include <cstdio> using namespace std; char a[25][25]; int n, m; int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0}; //四个方向数组 void dfs(int x, int y, int &res) { a[x][y] = '#'; res ++ ; for (int i = 0; i<4; i++) { int nx = x + dir[i][0]; int ny = y + dir[i][1]; if (nx>=0 && nx<n && ny>=0 && ny<m && a[nx][ny] == '.') dfs(nx, ny, res); } } int main() { while (cin >> m >> n && (n+m)) { memset(a, 0, sizeof(a)); for (int i = 0; i<n; i++) { for (int j = 0; j<m; j++) { cin >> a[i][j]; } } int res = 0; for (int i = 0; i<n; i++) { for (int j = 0; j<m; j++) { if (a[i][j] == '@') dfs(i, j, res); } } cout << res << endl; } return 0; }