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.
InputThe 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)
OutputFor 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
解题思路:
直接dfs,
实现代码:
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <bitset> using namespace std; #define rep(i,a,b) for (int i=(a),_ed=(b);i<=_ed;i++) #define per(i,a,b) for (int i=(b),_ed=(a);i>=_ed;i--) #define pb push_back const int inf_int = 2e9; const long long inf_ll = 2e18; #define inf_add 0x3f3f3f3f #define mod 1000000007 #define LL long long #define ULL unsigned long long #define MS0(X) memset((X), 0, sizeof((X))) #define SelfType int SelfType Gcd(SelfType p,SelfType q){return q==0?p:Gcd(q,p%q);} SelfType Pow(SelfType p,SelfType q){SelfType ans=1;while(q){if(q&1)ans=ans*p;p=p*p;q>>=1;}return ans;} #define Sd(X) int (X); scanf("%d", &X) #define Sdd(X, Y) int X, Y; scanf("%d%d", &X, &Y) #define Sddd(X, Y, Z) int X, Y, Z; scanf("%d%d%d", &X, &Y, &Z) #define reunique(v) v.resize(std::unique(v.begin(), v.end()) - v.begin()) #define all(a) a.begin(), a.end() #define mem(x,v) memset(x,v,sizeof(x)) typedef pair<int, int> pii; typedef pair<long long, long long> pll; typedef vector<int> vi; typedef vector<long long> vll; #define PI acos(-1.0) #define exp 1e-9 char mp[25][25]; int vis[25][25]; int ans; void dfs(int x,int y) { if(mp[x-1][y]=='.'&&vis[x-1][y]==0){ ans++; vis[x-1][y] = 1; dfs(x-1,y); } if(mp[x][y-1]=='.'&&vis[x][y-1]==0){ ans++; vis[x][y-1] = 1; dfs(x,y-1); } if(mp[x][y+1]=='.'&&vis[x][y+1]==0){ ans++; vis[x][y+1]= 1; dfs(x,y+1); } if(mp[x+1][y]=='.'&&vis[x+1][y]==0){ ans++; vis[x+1][y] = 1; dfs(x+1,y); } } int main() { int n,m,i,j; while(scanf("%d%d",&m,&n),m+n) { getchar(); ans=0; memset(vis,0,sizeof(vis)); memset(mp,'#',sizeof(mp)); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%c",&mp[i][j]); } getchar(); } for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(mp[i][j]=='@') { ans++; vis[i][j]=1; dfs(i,j); i=n; j=m; } } } printf("%d ",ans); } return 0; }