P1683 入门 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
AC代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 23;
int w, h;
char mp[N][N];
int dx[] = { -1,0,1,0 };
int dy[] = { 0,1,0,-1 };
int res = 1;
bool st[N][N];
void dfs(int x, int y)
{
for (int i = 0; i < 4; i++)
{
int a = x + dx[i];
int b = y + dy[i];
if (a<1 || a>h || b<1 || b>w)continue;
if (mp[a][b] != '.')continue;
if (st[a][b] == true)continue;
res++;
st[a][b] = true;
dfs(a, b);
}
}
int main()
{
cin >> w >> h;
for (int i = 1; i <= h; i++)
{
for (int j = 1; j <= w; j++)
{
cin >> mp[i][j];
}
}
for (int i = 1; i <= h; i++)
{
for (int j = 1; j <= w; j++)
{
if (mp[i][j] == '@')
{
st[i][j] = true;
dfs(i, j);
}
}
}
cout << res;
return 0;
}
相关解释:
这里值得注意的是:这题是不需要恢复现场的。因为这里要记录走过的最大的瓷砖数,也就是瓷砖可以重复走,但是不能重复计数。如果恢复现场的话,那么在某一点又走到了之前的位置,并且进行了dfs,那么就要计数了。因为代码新dfs一次就要res++。那么你之前走过了,你再走到这里时你又计数了一次。那如果没有写恢复现场的话,他就不会走原来走过的路的同时res++,因为他不符合新dfs的条件,所以不会进行dfs。这里回溯的同时如果遇到没走过的路,就res++。所以只要遇到没走过的路,res就++,所以就不会出现重复计数的情况。