Red and Black
Time limit:2000/1000 MS (java/others) Memory limit:65536/32768 K (java/others)
Total submission (s): 12907 Accepted Submission (s): 7983
Problem Descriptionthere 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.
Inputthe 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)
Outputfor each data set, your program should output a line which contains the number of tiles he can reach from the Initia L tile (including itself).
Sample Input
6 9....#......#..............................#@...#.#. #.11 9.#..........#.#######. #.#.....#.. #.#.###.#.. #.#[email protected]#.#. #.#####.#.. #.......#.. #########............ 11 6..#. #.. #....#.. #.. #....#.. #.. ###.. #.. #.. #@...#.. #.. #....#.. #.. #.. 7 7..#.#....#.#. ###.###[email protected]###.###. #.#....#.#.. 0 0
Sample Output
4559613
#include <iostream> #include <sstream> #include <algorithm> #include <cstdio> #include < string.h> #include <cctype> #include <string> #include <cmath> #include <vector> #include <stack> #include <queue> #include <map> #include <set>using namespace Std;const int Inf=40;char Cnt[inf][inf];int vis[inf][inf];int dir[][2]= {{1,0},{0,1},{-1,0},{0,-1}};int ans,w,h;void dfs (int x,int y) {for (int i= 0; i<4; i++) {int tx=dir[i][0]+x; int ty=dir[i][1]+y; if (tx>=1&&tx<=w&&ty>=1&&ty<=h&&!vis[tx][ty]&&cnt[tx][ty]== '.') {ans++; Vis[tx][ty]=1; DFS (Tx,ty); }} return; int main () {while (cin>>h>>w,h+w) {memset (vis,0,sizeof (VIS)); int SI,SJ; Ans=1; for (int i=1; i<=w; i++) scanf ("%s", cnt[i]+1); for (int i=1, i<=w; i++) {for (int j=1; j<=h; J + +) {if (cnt[i][j]== ' @ ') {si=i; Sj=j; Break }}} dfs (SI,SJ); cout<<ans<<endl; } return 0;}
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.
Hangzhou Electric HDU 1312 Red and Black (Super simple Dfs)