Red and Black(深搜和广搜)

题目大意:有一个长方形的房间,铺满了正方形瓷砖。每个瓷砖都是红色或黑色的。一个人站在一块黑色的瓷砖上。从一个瓷砖上,他可以移动到四个相邻(上下左右)的瓷砖中的一个。但是他不能移动到红色的瓷砖,只能在黑色的瓷砖上移动。通过重复上面描述的动作,编写一个程序来计算他能达到的黑瓷砖的数量。
输入:多个数据。第一行给出两个数m,n(0,0代表结束输入);m代表列,n代表行。m,n均不超过20。对每一块瓷砖,填入“@”代表人站的初始位置(黑砖),“.”代表黑色砖,“#”代表红色砖.
输出:输出人能踩过的黑色砖的总数(第一块人站的那个也算)。
输入样例:
6 9
…#.
…#





#@…#
.#…#.
11 9
.#…
.#.#######.
.#.#…#.
.#.#.###.#.
.#.#…@#.#.
.#.#####.#.
.#…#.
.#########.

11 6
…#…#…#…
…#…#…#…
…#…#…###
…#…#…#@.
…#…#…#…
…#…#…#…
7 7
…#.#…
…#.#…
###.###
…@…
###.###
…#.#…
…#.#…
0 0
输出样例:
45
59
6
13

代码:
深搜:`

#include
#include
int w,h,ans;
char s[22][22];
int vis[22][22];
void dfs(int x,int y)
{
	int nest[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
	vis[x][y]=1;
     ans++;
	for(int i=0;i<4;i++)
	{
		int dx=x+nest[i][0];
		int dy=y+nest[i][1];
		if(vis[dx][dy]==0&&s[dx][dy]!='#'&&dx>=0&&dx=0&&dy

我一开始在dfs里定义了x,y,temp,temp用来记录可行走的步数,不知道为什么会一直输出0,我就参照了大佬的代码改了,下面是我第一次写的代码

#include
#include
int w,h,temp;
char s[22][22];
int vis[22][22];
void dfs(int x,int y,int temp)
{
	int nest[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
	vis[x][y]=1;
	
	for(int i=0;i<4;i++)
	{
		int dx=x+nest[i][0];
		int dy=y+nest[i][1];
		if(vis[dx][dy]==0&&s[dx][dy]!='#'&&dx>=0&&dx=0&&dy

下面是广搜:

#include
#include
#include
using namespace std;
char s[22][22];
int vis[22][22];
int w,h,t;
struct node
{
	int x,y,step;
};
int bfs(int i,int j)
{
	int nest[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
	node a,b;
	queue q;
	t=1;
	a.x=i;
	a.y=j;
	q.push(a);
	vis[i][j]=1;
	while(!q.empty())
	{
		a=q.front();
		q.pop();
		for(int i=0;i<4;i++)
		{
			b.x=a.x+nest[i][0];
			b.y=a.y+nest[i][1];
			if(vis[b.x][b.y]==0&&s[b.x][b.y]!='#'&&b.x>=0&&b.x=0&&b.y

你可能感兴趣的:(Red and Black(深搜和广搜))