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<stdio.h>
#include<string.h>
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<h&&dy>=0&&dy<w)
		{
			dfs(dx,dy);		
		}
	}
	
}


int main()
{
	while(~scanf("%d %d",&w,&h)&&(w||h))
	{
		memset(vis,0,sizeof(vis));
		for(int i=0;i<h;i++)
		scanf("%s",&s[i]);
		ans=0;
		for(int i=0;i<h;i++)
		for(int j=0;j<w;j++)
		{
			if(s[i][j]=='@')
			{
				dfs(i,j);
				break;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

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

#include<stdio.h>
#include<string.h>
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<h&&dy>=0&&dy<w)
		{		
			dfs(dx,dy,temp+1);			
		}
	}
}




int main()
{
	while(~scanf("%d %d",&w,&h)&&(w||h))
	{
		memset(vis,0,sizeof(vis));
		for(int i=0;i<h;i++)
		scanf("%s",&s[i]);
		
		for(int i=0;i<h;i++)
		for(int j=0;j<w;j++)
		{
			if(s[i][j]=='@')
			{
				dfs(i,j,1);
				break;
			}
		}
		printf("%d\n",temp);
	}
	return 0;
}

下面是广搜:

#include<stdio.h>
#include<string.h>
#include<queue>
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<node> 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<h&&b.y>=0&&b.y<w)
			{
				t++;
				vis[b.x][b.y]=1;
				q.push(b);
			}
		}
	}
	return t;
}


int main()
{

	while(~scanf("%d %d",&w,&h)&&(w||h))
	{
		memset(vis,0,sizeof(vis));
		for(int i=0;i<h;i++)
		scanf("%s",&s[i]);
		for(int i=0;i<h;i++)
		{
			for(int j=0;j<w;j++)
			{
				if(s[i][j]=='@')
			    {
			    		bfs(i,j);
			    		break;
				}
			}
		}
		printf("%d\n",t);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/G191018/article/details/88843096