bfs红与黑

原创 2012年03月23日 15:03:20

Problem M

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

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

思路:还是很简单的bfs。


代码实现:

#include <stdio.h>
#include <string.h>
struct queuenode{								//建结构
	int a, b;
	}queue[100000];

int count, sx, sy, tx, ty, head = 0,tail = 0;			//定义
int a, b, n, temp;
int dir[4][2] = { {1,0} , {0,1} , {-1,0} , {0,-1} };
bool map[110][110];
int m, k, i, j;
int inarea(int x,int y)					//判断是否在区域内
{
	return x >= 0 && y >= 0 && x < a && y < b;
}

void bfs(  )									//bfs
{
	tail = head;
	queue[head].a = sx;							//初始化队列头部
	queue[head].b = sy;
	map[sx][sy] = 1;
	while(head <= tail){	    				//在队列中有数据的情况下进行循环
		for(k = 0;k < 4; k++){				//四个方向
			tx = queue[head].a + dir[k][0];
			ty = queue[head].b + dir[k][1];
			if(inarea(tx, ty) && map[tx][ty]== 0){
				tail++;
				count++;
				queue[tail].a = tx;
				queue[tail].b = ty;
				map[tx][ty] = 1;
			}
		}
		head++;
	}
	return;
}
		
int main(void)									//主函数
{
	while(scanf("%d%d",&b,&a)==2&&b!=0){
		memset(map, 1, sizeof(map));
		while(scanf(" ")||scanf("\n")) ;
		for(i = 0;i < a; i++){					//扫描地图
			for(j = 0;j < b; j++){
				scanf("%c",&temp);
				if (temp == '#') map[i][j] = 1;
				else if (temp == '.') map[i][j] = 0;
				else if (temp == '@') {
					map[i][j] = 0;
					sx = i;
					sy = j;
				}
				else {
					j--;
					continue;
				}
			}
		}
		count = 1;
		bfs();									//进入bfs
		printf("%d\n",count);
	}
	return 0;
}
	
	


C++搜索与回溯算法之红与黑

红与黑 Description 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。...
  • C20190413
  • C20190413
  • 2017年06月11日 14:41
  • 610

几个经典递归问题(放苹果,红与黑,八皇后,木棍)

9.5 例题:放苹果(一次枚举) 问题描述 把 M 个同样的苹果放在 N 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用 K 表示)注意:5,1,1 和 1,5,1 是同一种...
  • li1500742101
  • li1500742101
  • 2013年04月30日 11:47
  • 1373

【NOI OJ】1818 红与黑

1818:红与黑 总时间限制: 1000ms 内存限制: 65536kB 描述 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷...
  • C20190102
  • C20190102
  • 2016年08月26日 16:06
  • 789

【原创】浅谈搜索-中(dfs)(红与黑,Dungeon Master)

之前讲了几道dfs,现在我们再来讲几道dfs。 1818:红与黑 总时间限制: 1000ms 内存限制: 65536kB 描述有一间长方形的房子,地上铺了红色...
  • c20182030
  • c20182030
  • 2016年10月12日 13:32
  • 279

搜索之红与黑

1818:红与黑 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。输入...
  • xs1997
  • xs1997
  • 2017年04月27日 19:28
  • 149

[OpenJudge] 2.5基本算法之搜索 红与黑

这是NOI OPENJUDGE的一道题“红与黑”,题目要求统计最多的黑色瓷砖“.”,并输出最优解。本题用的是递归深搜,点击即可查看。...
  • C20180630
  • C20180630
  • 2016年08月24日 15:19
  • 870

百练oj2816:红与黑

总时间限制: 1000ms 内存限制: 65536kB 描述有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计...
  • homer12
  • homer12
  • 2014年01月21日 12:06
  • 715

递归--红与黑

问题描述 (其实就是POJ的1979,那上面的测试数据更多) 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一 块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算...
  • judyge
  • judyge
  • 2015年05月09日 08:27
  • 506

DFS与BFS的区别、用法、详解?

写在最前的三点: 1、所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次。 2、实现bfs和dfs都需要解决的一个问题就是如何存储图。一般有两种方法:邻接矩阵和邻接表。这里为简单起 见,均...
  • dreamzuora
  • dreamzuora
  • 2016年04月12日 21:02
  • 14078

java学习笔记之图的遍历(广度优先搜索BFS)

不知道有没小伙伴们跟我一样,在刚开始通过网络资源学习编程时,拿到大牛们的代码,总是希望拿到的是可以打印出结果的代码,但不解的是,大神似乎都不喜欢出示完整代码(这或许就是英雄所见略同吧)。我呢,是名编程...
  • samnancy
  • samnancy
  • 2014年12月28日 16:11
  • 1668
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bfs红与黑
举报原因:
原因补充:

(最多只允许输入30个字)