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