Red and Black

来源:互联网 发布:64位版本的windows 编辑:程序博客网 时间:2024/06/05 02:03

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, 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)

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

4559613
 
//此题根据马的走法改写#include<iostream>#include<cstdio>using namespace std;int mov[4][2]={0,1,0,-1,1,0,-1,0},a[22][22];int cnt,sx,sy,vis[22][22],w,h;void  dfs(int x,int y){  int i,nx,ny; for(i=0;i<4;i++) {  nx=x+mov[i][0];     ny=y+mov[i][1];     if(nx>=0 && nx<h && ny>=0&&ny<w&&!vis[nx][ny]&&  a[nx][ny]!=-1)         {  cnt++;             vis[nx][ny]=1;           dfs(nx,ny);                  } }}int main(){  int i,j,flag=1;   char b[22][22];  while(scanf("%d%d",&w,&h)!=EOF)  {  if(w==0&&h==0)  break;     flag=1;    for(i=0;i<h;i++)for(j=0;j<w;j++)cin>>b[i][j];  for(i=0;i<h;i++)   for(j=0;j<w;j++)   if(b[i][j]=='@')  { a[i][j]=1; flag=0; sx=i;  sy=j;}   else if(b[i][j]=='.')  a[i][j]=0;   else if(b[i][j]=='#')  a[i][j]=-1;                  memset(vis,0,sizeof(vis));                if(flag) printf("0\n"); else {   cnt=1;              vis[sx][sy]=1; dfs(sx,sy);             printf("%d\n",cnt);  } } return 0;}

0 0
原创粉丝点击