POJ 1979 Red and Black (深搜)

Red and Black

Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 23095   Accepted: 12467

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
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#[email protected]#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
[email protected]
###.###
..#.#..
..#.#..
0 0

Sample Output

45
59
6
13

Source

Japan 2004 Domestic

简答的模板,

代码如下;

#include<stdio.h>
#include<string.h>
char a[22][22];
int v[22][22];
int sum;
void dfs(int i,int j)
{
	if(a[i-1][j]=='.'&&v[i-1][j]==0)
	{
		sum++;
		v[i-1][j]=1;
		dfs(i-1,j);
	}
	if(a[i][j-1]=='.'&&v[i][j-1]==0)
	{
		sum++;
		v[i][j-1]=1;
		dfs(i,j-1);
	}
	if(a[i][j+1]=='.'&&v[i][j+1]==0)
	{
		sum++;
		v[i][j+1]=1;
		dfs(i,j+1);
	}
	if(a[i+1][j]=='.'&&v[i+1][j]==0)
	{
		sum++;
		v[i+1][j]=1;
		dfs(i+1,j);
	}
}
int main()
{
	int n,m,i,j;
	while(~scanf("%d%d",&n,&m),n||m)
	{
		getchar();
		sum=0;
		memset(v,0,sizeof(v));
		memset(a,'#',sizeof(a));
		for(i=0;i<m;i++)
		{
			for(j=0;j<n;j++)
			{
				scanf("%c",&a[i][j]);
			}
			getchar();
		}
		for(i=0;i<m;i++)
		{
			for(j=0;j<n;j++)
			{
				if(a[i][j]=='@')
				{
					v[i][j]=1;
					sum+=1;
					dfs(i,j);
					break;
				}
			}
		}
		printf("%d\n",sum);
	}
	return 0;
}
时间: 2024-10-24 20:38:40

POJ 1979 Red and Black (深搜)的相关文章

POJ 1979 Red and Black 深度优先搜索上手题

Red and Black Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 21738   Accepted: 11656 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

POJ 1979 Red and Black (红与黑)

POJ 1979 Red and Black (红与黑) Time Limit: 1000MS    Memory Limit: 30000K 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

POJ 1979 Red and Black【深度优先搜索】

题目链接:http://poj.org/problem?id=1979 题目大意:一个矩形的房间地板被分为w*h个小块,每一个小块不是红的就是黑的,你首先站在一个黑色小块上,你只能朝你的四个方向(上下左右)移动,且不能到达红色的小块上,问你最多能到达多少个小块. 很简单的dfs深度优先搜索 没搜索过一个格子,将该格子设置为红色,之后的搜索就不会再搜索到该格子,就不会造成重复,因为该题有很多数据,记得每次处理数据是初始化各数组及其他数据. 代码如下: #include <iostream> #i

Red and Black 深搜

 B - Red and Black Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Status Description There is a rectangular room, covered with square tiles. Each tile is colored either red

《挑战》2.1 POJ POJ 1979 Red and Black (简单的DFS)

B - Red and Black Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1979 Description There is a rectangular room, covered with square tiles. Each tile is col

POJ 1979 Red and Black (DFS)

Red and Black Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 23904   Accepted: 12927 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

poj 3009 Curling 2.0 深搜

http://poj.org/problem?id=3009 题意:一个小球在一个格子里滑行,当你给它一个力时,他会一直滑,直到前方碰到一个雪球停止,这时前方的雪球会消失,你继续给该小球任意一个方向的力...问至少需要几步才能到达到终点. 分析: 一般在求  最短路    时会用到   广搜,但是  本题  在搜索时, 每走一步, 现场状态是需要改变的 ,如果该步不满足,又需要把现场状态还原回去  ,这样   深搜  才能满足 因此用  深搜     只能把   所有能到达终点的路的步数    

poj 1979 Red and Black(dfs)

简单深搜 1 #include <cstdio> 2 int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}}; 3 char map[21][21]; 4 int n,m; 5 int result; 6 7 void DFS(int sx, int sy) 8 { 9 int tx,ty; 10 for(int k = 0; k < 4; ++k) 11 { 12 tx = sx + dir[k][0]; 13 ty = sy + dir[k][1];

POJ 1979 Red and Black dfs 难度:0

http://poj.org/problem?id=1979 #include <cstdio> #include <cstring> using namespace std; const int maxn = 21; bool vis[maxn][maxn]; char maz[maxn][maxn]; int n,m; const int dx[4] = {1,-1,0,0}; const int dy[4] = {0,0,1,-1}; int ans; bool in(int