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

来源:互联网 发布:逆袭网络剧百度云资源 编辑:程序博客网 时间:2024/05/16 19:17

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

输入描述:第一行输入两个整数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);//左边}}}


0 0