路径问题系列之HDU1312 Red and Black(DFS)

来源:互联网 发布:java小软件源代码 编辑:程序博客网 时间:2024/06/06 20:38

HDU1312 Red and Black

题目

Time Limit:1000MS Memory Limit:32768KB

  • 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

分析

本题属于路径类题目,由于缺乏经验,刚开始做的时候遇到了不小的阻力,现在和大家分享一些做题时的心得,技巧。首先,整个图是二维的,很自然地使用二维数组保存坐标以及坐标上的内容。其次,无论采用何种遍历节点的方法(DFS/BFS/…)都必须明确一个方向,这时我们可以专门创建一个用于方向变换的二维数组使得代码变得优美,只要移动过后的位置符合题目条件即可,继续进行下一层搜索,并得到答案。

代码

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;char mat[22][22];int num;int w, h;int t[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};void dfs(int i,int j){    mat[i][j] = '#';    for(int k = 0; k<4; k++)    {        int x = i+t[k][0];        int y = j+t[k][1];        if(x<h && y<w && x>=0 && y>=0 && mat[x][y] == '.')        {            num++;            dfs(x, y);        }    }    return;}int main(){    int x, y;    while(scanf("%d%d", &w, &h) == 2 && w+h != 0)    {        num = 1;        for(int i = 0; i<h; i++)        {            for(int j = 0; j<w; j++)            {                cin >> mat[i][j];                if(mat[i][j] == '@')                {                    x = i;                    y = j;                }            }        }        dfs(x, y);        printf("%d\n", num);    }    return 0;}
1 0