目录
牛客_红与黑(简单dfs)
解析代码
循环接收每组用例,对于每组用例进行如下操作: 1. 找到‘@’所在的位置,即起始搜索的点 2. 使用DFS搜索地板中的每块瓷砖,如果是黑色,给计数+1,然后像该黑色的上下左右四个方向继续搜索注意:在搜索时,如果遇到白色瓷砖,或者该位置已经搜索过了,则停止该位置的搜索
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
bool vis[21][21];
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
int m = 0, n = 0, cnt = 0;
/*
1. “.”:黑色的瓷砖;
2. “#”:白色的瓷砖;
3. “@”:黑色的瓷砖,并且你站在这块瓷砖上
*/
void dfs(vector<vector<char>>& arr, int sr, int sc)
{
++cnt;
vis[sr][sc] = true;
for(int i = 0; i < 4; ++i)
{
int x = sr + dx[i], y = sc + dy[i];
if(x >= 0 && x < m && y >= 0 && y < n
&& !vis[x][y] && arr[x][y] == '.')
{
dfs(arr, x, y);
}
}
}
int main()
{
while(cin >> m >> n)
{
cnt = 0;
memset(vis, 0, sizeof(vis));
vector<vector<char>> arr(m, vector<char>(n));
int sr = 0, sc = 0;
for(int i = 0; i < m; ++i)
{
for(int j = 0; j < n; ++j)
{
cin >> arr[i][j];
if(arr[i][j] == '@')
sr = i, sc = j;
}
}
dfs(arr, sr, sc);
cout << cnt << endl;
}
return 0;
}