Description
There is a rectangular and covered with square tiles. Each tile is colored either red or black. A man was standing on a black tile. From a tiles, he can move to one of the four adjacent tiles. But he can ' t move on red tiles, and 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.
Input
The input consists of multiple data sets. A data set starts with a line containing the positive integers W and H; W and H is the numbers of tiles in the X-and y-directions, respectively. W and H is not more than 20.
There is H more lines in the data set, and each of the 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)
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.#..........#.#######. #.#.....#.. #.#.###.#.. #.#[email protected]#.#. #.#####.#.. #.......#.. #########............ 11 6..#. #.. #....#.. #.. #....#.. #.. ###.. #.. #.. #@...#.. #.. #....#.. #.. #.. 7 7..#.#....#.#. ###.###[email protected]###.###. #.#....#.#.. 0 0
Sample Output
4559613 Dfs Search, lazy to explain, look at the code yourself.
#include <cstdio> #include <cstring> #include <algorithm>using namespace Std;int N,m,ans;char map[25] [25];int yi[4][2]={{1,0},{-1,0},{0,1},{0,-1}};void dfs (int x,int y) { int i,rx,ry; map[x][y]= ' # '; ans++; for (i=0;i<4;i++) { rx=x+yi[i][0]; RY=Y+YI[I][1]; if (rx>=1&&rx<=n&&ry>=1&&ry<=m&&map[rx][ry]== '. ') { DFS (rx,ry);}} } int main () { int i,j,x,y; while (~SCANF ("%d%d", &m,&n)) { if (n==0&&m==0) break; ans=0; for (i=1;i<=n;i++) for (j=1;j<=m;j++) { scanf ("%c", &map[i][j]); if (map[i][j]== ' @ ') { x=i; y=j; } } DFS (x, y); printf ("%d\n", ans); } return 0;}
Hdu1312:red and Black