POJ 1979

3911 단어 poj
Red and Black
Time Limit: 1000MS
 
Memory Limit: 30000K
Total Submissions: 17061
 
Accepted: 8996
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) The end of the input is indicated by a line consisting of two zeros.
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
45

59

6

13

#include <iostream>

#include <cstring>

#include <cstdlib>

using namespace std;

char s[25][25];

bool visit[25][25];

int col,row;

int ans;

void dfs(int x,int y)

{

	visit[x][y]=1;

	if(x>0&&!visit[x-1][y]&&s[x-1][y]=='.')

	{

        ans++;

		dfs(x-1,y);

	}

	if(y>0&&!visit[x][y-1]&&s[x][y-1]=='.')

	{

		ans++;

		dfs(x,y-1);

	}

	if(x+1<row&&!visit[x+1][y]&&s[x+1][y]=='.')

	{

		ans++;

		dfs(x+1,y);

	}

	if(y+1<col&&!visit[x][y+1]&&s[x][y+1]=='.')

	{

		ans++;

		dfs(x,y+1);

	}

}   

int main()

{

    int i,j,k,T;

    int p,q;

    while(cin>>col>>row,row||col)

    {

        ans = 1;

        memset(s,0,sizeof(s));

        memset(visit,0,sizeof(visit));

        for(i=0;i<row;i++)

        {

            //getchar();

            for(j=0;j<col;j++)

            {

                cin>>s[i][j];

                if(s[i][j]=='@')

                {

                    p = i;

                    q = j;

                }

            }

        }

        dfs(p,q);

        cout<<ans<<endl;

    }

    system("pause");

    return 0;

}

                                 

    

	


 
// 



#include<stdio.h>

 char m[20][20];

 int r,c,count;

 void cnt(int i,int j)//  

 {

     if(m[i][j]=='#'||(i<0||j<0)||(i>r-1||j>c-1))// ,  

         return;

     m[i][j]='#';// , '#',  

     count++;   //count+1

     cnt(i,j-1);//  

     cnt(i-1,j);//  

     cnt(i,j+1);//  

     cnt(i+1,j);//  

 }

 int main()

 {

     int i,j,x,y;

     while(scanf("%d%d",&c,&r),r||c){

         for(count=i=0;i<r;++i){

             getchar();

             for(j=0;j<c;++j){

                 m[i][j]=getchar();

                 if(m[i][j]=='@'){//  

                     x=i;

                     y=j;

                 }

             }

         }

         cnt(x,y);

         printf("%d
",count); } return 0; }

  

좋은 웹페이지 즐겨찾기