Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 31376 | Accepted: 17119 |
Description
There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can't move on red tiles, he can move only on black tiles.
Write a program to count the number of black tiles which he can reach by repeating the moves described above.
Write a program to count the number of black tiles which he can reach by repeating the moves described above.
Input
The input consists of multiple data sets. A data set starts with a line containing two positive integers W and H; W and H are the numbers of tiles in the x- and y- directions, respectively. W and H are not more than 20.
There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.
'.' - a black tile
'#' - a red tile
'@' - a man on a black tile(appears exactly once in a data set)
The end of the input is indicated by a line consisting of two zeros.
There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.
'.' - a black tile
'#' - a red tile
'@' - a man on a black tile(appears exactly once in a data set)
The end of the input is indicated by a line consisting of two zeros.
Output
For each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself).
Sample Input
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
Sample Output
45 59 6 13 思路:一道很正宗的BFS,不过DFS也可以,熟悉算法思想的不用多说,一看就明白。 //DFS#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX_N 20 int W, H; char a[MAX_N][MAX_N]; int res=0; int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1}; int x,y; void dfs(int nx, int ny) { int i; if(nx >= 0 && nx < H && ny >= 0 && ny < W && a[nx][ny] =='.') { a[nx][ny] = '#'; res++; } else return; for(i = 0; i < 4; i++) { x = nx + dx[i]; y = ny + dy[i]; if(a[x][y]=='.') { dfs(x,y); } } } int main() { int nx=0 , ny=0; int i, j; while(scanf("%d%d\n",&W, &H) && (W || H)) { for(i=0; i<H; i++) { for(j=0; j<W; j++) { scanf("%c",&a[i][j]); if(a[i][j]=='@') { nx = i; ny = j; } } getchar(); } a[nx][ny] = '.'; dfs(nx,ny); printf("%d\n",res); res=0; } //system("PAUSE"); return 0; }
//BFS#include <stdio.h> #include <queue> using std::queue; #define MAXN 25 bool vis[MAXN][MAXN]; char map[MAXN][MAXN]; int W, H, result; int dx[4] = {1, 0, -1, 0}, dy[4] = {0, -1, 0, 1}; struct Tile { // 以状态(棋子坐标)为结点 int x, y; }tile[MAXN*MAXN]; queue <Tile> q; bool reachable(Tile next) { return map[next.x][next.y] != '#' && next.x >= 1 && next.x <= W && next.y >= 1 && next.y <= H; } void bfs() { Tile cur, next; while (!q.empty()) { cur = q.front(); q.pop(); result++; for (int i = 0; i < 4; ++i) { next.x = cur.x + dx[i]; next.y = cur.y + dy[i]; if (reachable(next) && !vis[next.x][next.y]) { vis[next.x][next.y] = true; q.push(next); } } } } int main() { int i, j; Tile start; while (scanf("%d%d", &W, &H), W && H) { result = 0; memset(vis, false, sizeof(vis)); // 数据初始化 for (i = 1; i <= H; ++i) for (j = 1; j <= W; ++j) { scanf(" %c", &map[i][j]); // x y if (map[i][j] == '@') { start.x = j; start.y = i; vis[j][i] = true; q.push(start); } } bfs(); printf("%d\n", result); } return 0; }