dfs水题_hdu1312,人间不值得

Red and Black

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 28227    Accepted Submission(s): 17064


 

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

45

59

6

13

离变成富婆又近了一步的AC代码:

#include
#include
#include

using namespace std;

int h,w;
vectorpic;
int idx[22][22];
int key=0;
void dfs(int r,int c)
{
    if(r<0||r>=h||c<0||c>=w)
        return;
    if(pic[r][c]=='#'||idx[r][c]!=0)
        return ;
    idx[r][c]=1;
    key++;
    for(int pr=-1;pr<=1;pr++)
        for(int pc=-1;pc<=1;pc++){
            if((pc&&!pr)||(!pc&&pr))   //这里应该注意搜索的方向,是十字
                dfs(r+pr,c+pc);
        }
}

int main()
{
    string word;
    while((cin>>w>>h)&&w&&h){//w表示列,h表示行 
        key=0;
        pic.clear();
        for(int i=0;i             cin>>word;
            pic.push_back(word);
            fill(idx[i],idx[i]+w,0);
        }
        for(int i=0;i             for(int j=0;j                 if(idx[i][j]==0&&pic[i][j]=='@'){
                    dfs(i,j);
                }
                    
            }
            cout<     }
    return 0;
}

你可能感兴趣的:(dfs水题_hdu1312,人间不值得)