原题链接:P1683 入门 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
注意:
- 行列输入的是反着的
- 搜索的时候,走过的可以重复走,这里比较迷惑人,在使用dfs时,每一次搜索一定会把相关所有能走的路全走完,所以重复走过的可以不考虑。题目要求最大步数,但是重复的砖不计数,所以再次强调重复走过的可以不考虑
- 关于步数,每次找到一个能走的砖,步数ans就加1
代码如下:
#include<bits/stdc++.h>
using namespace std;
int w, h, ans ;
char arr[25][25];
int st[25][25]; //用来标记每个元素的状态,没走设为0
void dfs(int x, int y)
{
if(x < 1 || x > h || y < 1 || y > w || arr[x][y] == '#' || st[x][y] == 1) return ; //越界返回
st[x][y] = 1;//标记走过
ans++;
//从四个方向搜索
dfs(x - 1, y);
dfs(x + 1, y);
dfs(x, y - 1);
dfs(x, y + 1);
}
int main()
{
cin >> w >> h; //h行,w列
int ax, ay; //用来标记搜索的起点
for(int i = 1; i <= h; i ++)
for(int j = 1; j <= w; j ++) {
cin >> arr[i][j];
if(arr[i][j] == '@') ax = i, ay = j;
}
dfs(ax, ay);
cout << ans << endl;
return 0;
}