【ACM】【DFS】【水】Red and Black

版权声明:转载请注明出处~~~ https://blog.csdn.net/lesileqin/article/details/89044013

Red and Black

点我前往题目页面

Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 47795   Accepted: 25706

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

Source

Japan 2004 Domestic

题目大意:

一个人站在一个黑地板上,然后他可以走四个方向,左下右上,并且他只能走黑色格子,问:他能走到的黑色格子有多少个?

解题思路:

深搜,要加一个标记,标记该地板已经走过了。每次到一个黑色地板ans++。每次都要对地图和标记变量、ans初始化。

吐槽:日本人的思路真奇特,先输入列、再输入行。硬是半天没有反应过来。

//Red and Black
/*
'.' - a black tile
'#' - a red tile
'@' - a man on a black tile(appears exactly once in a data set) 
*/

#include<iostream>
#define MAXN 30
using namespace std;

char mapp[MAXN][MAXN];
bool book[MAXN][MAXN]={false};
int nextt[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int N,M;		//N列 M行
int ans=0;

void dfs(int x,int y)
{
	for(int i=0;i<4;i++)
	{
		int gx=x+nextt[i][0];
		int gy=y+nextt[i][1];
		if(gx>=0&&gx<M&&gy>=0&&gy<N&&mapp[gx][gy]=='.'&&book[gx][gy]==false)
		{
			ans++;
			book[gx][gy]=true;
			dfs(gx,gy);
		}
	}
}

int main()
{
	while(cin >> N >> M && N && M)
	{
		int x,y;
		ans=0;
		for(int i=0;i<MAXN;i++)
			for(int j=0;j<MAXN;j++)
				book[i][j]=false,mapp[i][j]='\0';
		for(int i=0;i<M;i++)
			for(int j=0;j<N;j++)
			{
				cin >> mapp[i][j];
				if(mapp[i][j]=='@')
					x=i,y=j;
			}
		book[x][y]=true;		
		dfs(x,y);
		cout << ans+1 << endl;	
	} 
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lesileqin/article/details/89044013