笔试题-计算图中黑色瓷砖数(深度优先遍历的使用)

题目:小明站在一间贴满黑白相间瓷砖的房间里,小明站在黑色瓷砖处,小明处于好奇,希望每次只向相邻黑色瓷砖移动,现在小明想知道自己最多可以踩到多少块黑色瓷砖。

输入描述:第一行输入两个整数M、N,分别表示房间的长宽,也就是横竖瓷砖的数目

从第二行开始接下来的M行N列输入瓷砖类型,*表示黑色瓷砖,.表示白色瓷砖,@符号表示小明当前所在的黑色瓷砖

当输入的M,N都为0时,结束输入。


代码:

#include <iostream>
#include <vector>
using namespace std;

//深度优先搜索合法瓷砖数目的递归核心函数
//param@1 brickArr瓷砖数组,包含每个位置的瓷砖情况,*表示黑色瓷砖,.表示白色瓷砖,@表示起始位置的黑色瓷砖
//param@2 flagArr标记数组,用于记录某个位置是否被访问过
//param@3 startX起始递归处的X坐标
//param@4 startY起始递归处的Y坐标
//param@5 brickCount符合条件的瓷砖数目
void dfsCore(vector<vector<char>> brickArr,vector<vector<int>>& flagArr,
	int startX,int startY,int& brickCount);

int main()
{
	int M, N;
	while (cin >> M >> N)
	{
		if (0==M && 0==N)
		{
			break;	//输入全为0则结束输入和计算
		}

		vector<vector<char>> brickArr(M, vector<char>(N,'#'));	//瓷砖数组
		int startX, startY;	//起始点的X,Y坐标

		//以下两个for循环用于输入瓷砖数据
		for (int i = 0; i < M;++i)
		{
			for (int j = 0; j < N;++j)
			{
				cin >> brickArr[i][j];
				if (brickArr[i][j] == '@')	//明确表明的初始位置
				{
					startX = i;
					startY = j;
				}
			}
		}
		vector<vector<int>> flagArr(M,vector<int>(N,0));//标记数组
		int blackBrickCount = 0;	//符合条件的瓷砖数

		dfsCore(brickArr,flagArr,startX,startY,blackBrickCount);

		cout << blackBrickCount << endl;
	}
	return 0;
}

void dfsCore(vector<vector<char>> brickArr, vector<vector<int>>& flagArr, 
	int startX, int startY, int& brickCount)
{
	//检查坐标是否合法
	if (startX >= 0 && startX < brickArr.size() && startY >= 0 && startY < brickArr[0].size())
	{
		if (flagArr[startX][startY] != 1)	//未被访问过
		{
			flagArr[startX][startY] = 1;
			if (brickArr[startX][startY] == '*' || brickArr[startX][startY] == '@')	//如果为黑色瓷砖
			{
				++brickCount;
			}
			dfsCore(brickArr, flagArr, startX - 1, startY, brickCount);	//上边
			dfsCore(brickArr, flagArr, startX, startY + 1, brickCount);	//右边
			dfsCore(brickArr, flagArr, startX + 1, startY, brickCount);	//下边
			dfsCore(brickArr, flagArr, startX, startY - 1, brickCount);	//左边
		}
	}
}
    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/owen7500/article/details/52870828
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞