试题 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的(上下左右四个方向)黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
#include <iostream>
#include <vector>
using namespace std;
// 红与黑 -- 深度优先遍历
//站在一个瓷砖的位置 遍历该瓷砖
int direct[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
void dfs(vector<vector<char>>& vv, int row,int col, int x,int y, vector<vector<bool>>& flag, int& count)
{
if(x < 0 || y < 0 || x >= row || y >= col)
return;
// 该位置 是否已经遍历 flag
if(flag[x][y])
return;
if(vv[x][y] == '#')
return;
// 该位置没有遍历过
++count;
flag[x][y] = true;
// 像四个方向 遍历
for(int i = 0; i<4;i++)
{
int nx = x + direct[i][0];
int ny = y + direct[i][1];
dfs(vv,row,col,nx,ny,flag,count);
}
}
int main()
{
int m = 0;
int n = 0;
while(cin >> m >> n)
{
int rpos = 0; // 行
int cpos = 0; // 列
vector<vector<char>> vv(m, vector<char>(n));
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cin >> vv[i][j];
if (vv[i][j] == '@') // 找到起点
{
rpos = i;
cpos = j;
}
}
}
// DFS 遍历
vector<vector<bool>> flag(m, vector<bool>(n,false)); // 这里直接
int count = 0;
dfs(vv,m,n,rpos,cpos,flag, count);
cout << count << endl;
}// end of while
return 0;
}