c++深度优先搜索例题之瓷砖问题

本文介绍了一个编程问题,涉及在一个给定的w×h矩形广场上,小林从一个黑色瓷砖出发,通过DFS遍历所有可到达的黑色瓷砖。代码实现了深度优先搜索策略来计算经过的黑色瓷砖数量。
摘要由CSDN通过智能技术生成

没什么好讲的代码有详解 

问 题 描 述
 在 一 个 w × h 的 矩 形 广 场 上 , 每 一 块 1 × 1 的 地 面 都 铺 设 了 红 色 或 黑 色 的 瓷 砖 。 小 林 同 学 站 在 某 一 块 黑 色 的 瓷 砖 上 , 他 可 以 从 此 处 出 发 , 移 动 到 上 、 下 、 左 、 右 四 个 相 邻 的 且 是 黑 色 的 瓷 砖 上 。 现 在 , 他 想 知 道 , 通 过 重 复 上 述 移 动 所 能 经 过 的 黑 色 瓷 砖 数 。 输 入 要 求 : 第 1 行 为 h 、 w ( 2 < w 、 h < 50 ) , 之 间 由 一 个 空 格 隔 开 以 下 为 一 个 w 行 h 列 的 二 维 字 符 矩 阵 , 每 个 字 符 为 “ 分 别 表 示 该 位 置 为 黑 色 的 瓷 砖 、 红 色 的 瓷 砖 、 小 林 的 初 始 位 置 输 出 要 求 : 输 出 一 行 一 个 整 数 , 表 示 小 林 从 初 始 位 置 出 发 经 过 的 黑 色 瓷 砖 数 。

输入样例
11 9
. # . . . . . . . . . 
. # . # # # # # # # .
. # . # . . . . . # .
. # . # . # # # . # .
. # . # . . @ # . # . 
. # . # # # # # . # .
. # . . . . . . . # .
. # # # # # # # # # .
. . . . . . . . . . . 

输出样例

59

题目描述

题目描述了一个在矩形广场上的瓷砖遍历问题。广场的大小为 w × h(宽为 w,高为 h),其中每一块 1 × 1 的地面都铺设了红色或黑色的瓷砖。小林同学站在某一块黑色的瓷砖上,他可以从当前位置出发,向上、下、左、右四个方向移动到相邻的黑色瓷砖上。小林同学想知道,通过重复上述移动,他能够经过的所有黑色瓷砖的总数。

代码实现

#include<bits/stdc++.h>
using namespace std;
int n,m,s=0;
char a[105][105];
int X[5]={-1,1,0,0},Y[5]={0,0,-1,1};//{-1(向上),1(向下),0,0}  {0,0,-1(向左),1(向右)} 
void dfs(int x,int y){
	
	//
	if(!(a[x-1][y]=='.'&&a[x+1][y]=='.'&&a[x][y-1]&&a[x][y+1]=='.')){
		return ;
	}
	//判断如果周围没有细胞的时候就返回 
	
	for(int i=0;i<4;i++)//四个方向 
	{
		//如果x=1,x[i]=-1,所以a[x+X[i]]=a[1-1]=a[0],同理 
		if(a[x+X[i]][y+Y[i]]=='.')//判断这个是否是细胞 
		{
			a[x+X[i]][y+Y[i]]='#';//标记 
			s++;//计数 
			dfs(x+X[i],y+Y[i]);//递归搜索 
			a[x+X[i]][y+Y[i]]='.';//删除标记 
		}
	}
	
	
}
int main(){
	int x,y;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
			
			//
			if(a[i][j]=='@'){
				x=i;
				y=j;
			}
			//获取@的位置 
			
		}
	}
	dfs(x,y);
	cout<<s;
	return 0;
}

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值