Problem 81 » Red and Black

来源:互联网 发布:2016三毛淘宝小号网址 编辑:程序博客网 时间:2024/05/23 07:25

Description

There is a rectangular room, covered with square tiles. Eachtile is colored either red or black. A man is standing on a blacktile. From a tile, he can move to one of four adjacent tiles. Buthe 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 canreach by repeating the moves described above.

INPUT

Theinput consists of multiple data sets. A data set starts with a linecontaining two positive integers W and H; W and H are the numbersof tiles in the x- and y- directions, respectively. W and H are notmore than 20.

There are H more lines in the data set, each of which includes Wcharacters. Each character represents the color of a tile asfollows.

'.' - a black tile
'#' - a red tile
'@' - a man on a black tile(appears exactly once in a dataset)

OUTPUT

Foreach data set, your program should output a line which contains thenumber of tiles he can reach from the initial tile (includingitself).

SAMPLE INPUT

6 9....#......#..............................#@...#.#..#.11 9.#..........#.#######..#.#.....#..#.#.###.#..#.#..@#.#..#.#####.#..#.......#..#########............11 6..#..#..#....#..#..#....#..#..###..#..#..#@...#..#..#....#..#..#..7 7..#.#....#.#..###.###...@...###.###..#.#....#.#..0 0

SAMPLE OUTPUT

4559613

 

#include<iostream>
using namespace std;
int num,w,h;
char a[21][21];
bool f(int x,int y)
{
  if(x<0||x>=h||y<0||y>=w)
   return 0;
   else
   return 1;
}
void dps(int x,int y)
{
  if(f(x,y)&&a[x][y]=='.')
   {
    a[x][y]='#';
    num++;
   dps(x-1,y);
   dps(x+1,y);
   dps(x,y-1);
   dps(x,y+1);
   }
  
}
int main()
{
    inti,j;
 while(cin>>w>>h&&w!=0&&h!=0)
 {
  for(i=0;i<h;i++)
  for(j=0;j<w;j++)
  cin>>a[i][j];
  num=0;
  for(i=0;i<h;i++)
  for(j=0;j<w;j++)
   if(a[i][j]=='@')
    {
     a[i][j]='.';
    dps(i,j);
    }
 cout<<num<<endl;
 }

}

0 0
原创粉丝点击