现在的位置: 首页 > 综合 > 正文

13.04.07 Red and Black (DFS)

2018年01月12日 ⁄ 综合 ⁄ 共 2156字 ⁄ 字号 评论关闭

Red and Black

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 25   Accepted Submission(s) : 20

Font: Times New Roman | Verdana | Georgia

Font Size:  

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

算法
	深度优先搜索(DFS)

思路:
	从“@”出发,向与其相邻的上下左右走,走过并标记,当无路可走时,回到上一个节点,搜索下一个方向,直到全部搜索完毕。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int x,y,a[23][23],map[23][23],t;
int go(int i, int j)
{
    int k;
    if (map[i][j]==1)
	{
		t++;
		map[i][j]=0;
		if (a[i+1][j]==a[i][j]) go(i+1,j);
		if (a[i-1][j]==a[i][j]) go(i-1,j);
		if (a[i][j+1]==a[i][j]) go(i,j+1);
		if (a[i][j-1]==a[i][j]) go(i,j-1);
	}
	return t;
}
int main ()
{
    int i,j,w,h;
    char ch;
    while (cin>>y>>x)
    {
        if (x==0 && y==0) break;
        t=0;
        memset(a,0,sizeof(a));
        memset(map,1,sizeof(map));
        for (i=0; i<x; i++)
        {
            for (j=0; j<y; j++)
            {
                cin>>ch;
                if (ch=='.')
                    a[i][j]=1;
                else if (ch=='#')
                    a[i][j]=0;
                else
                {
                    a[i][j]=1;
                    w=i;
                    h=j;
                }
                map[i][j]=1;
            }
        }
        go(w,h);
        cout<<t<<endl;
    }
    return 0;
}	

抱歉!评论已关闭.