题目:小明站在一间贴满黑白相间瓷砖的房间里,小明站在黑色瓷砖处,小明处于好奇,希望每次只向相邻黑色瓷砖移动,现在小明想知道自己最多可以踩到多少块黑色瓷砖。
输入描述:第一行输入两个整数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); //左边 } } }