Hdu 1312 Red and Black (Deep Search)
Red and BlackTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission (s): 10286 Accepted Submission (s): 6426
Problem 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.
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 ctions, respectively. W and H are not more than 20.
There are H more lines in the data set, each of which between des 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 shocould 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
4559613
Source Asia 2004, Ehime (Japan), and Japan Domestic do a good job of detail, imminent !!! Originally, all three groups of test data were correct, and the last group was not correct. After a noon debugging, we found that the map array was not initialized .... The Code is as follows:
# Include
# Include
Char map [1001] [1001]; int visit [1001] [1001]; int count, n, m; void dfs (int a, int B) {if (a <0 | B <0 | a> = 1001 | B >= 1001) return; if (! Visit [A-1] [B] & map [A-1] [B] = '. ') {visit [A-1] [B] = 1; count ++; dfs (A-1, B); // visit [n-1] [m] = 0;} if (! Visit [a] [b-1] & map [a] [b-1] = '. ') {visit [a] [b-1] = 1; count ++; dfs (a, B-1); // visit [n] [s-1] = 0;} if (! Visit [a + 1] [B] & map [a + 1] [B] = '. ') {visit [a + 1] [B] = 1; count ++; dfs (a + 1, B ); // visit [n + 1] [m] = 0;} if (! Visit [a] [B + 1] & map [a] [B + 1] = '. ') {visit [a] [B + 1] = 1; count ++; dfs (a, B + 1 ); // visit [n] [m + 1] = 0;} else return;} int main () {int I, j; while (~ Scanf ("% d", & n, & m), n | m) {count = 1; memset (visit, 0, sizeof (visit )); memset (map, '#', sizeof (map); // This must be added, because of this negligence, I fully debugged for one noon... For (I = 0; I