🐾或许会很慢,但是不可以停下🐾
题目
- 看清楚给的n,m分别是行还是列
- 已访问过的点可以记作是“墙” # 小tip
- 每次重新使用数据的时候 记得重置memset 0 或者-1 !!
- 还是边界问题 是大于还是小于 || 或者 && 都要分析清楚,不能随意
- 所求是可到达 不是最远
One
#include<bits/stdc++.h>
using namespace std;
const int N=30;
int res;
int n,m;
char g[N][N];
bool st[N][N];
void dfs(int x, int y) {
if(x<1 || y<1 || x>n || y>m || g[x][y]=='#' || st[x][y]) // 越界或遇到墙或已访问
return;
st[x][y] = true; // 标记为已访问
res++; // 增加可到达瓷砖计数
// 探索四个方向
dfs(x+1, y);
dfs(x-1, y);
dfs(x, y+1);
dfs(x, y-1);
}
int main() {
while(cin >> m >> n, m || n) { // 确保m和n的使用与题目描述一致
memset(g, 0, sizeof g);
memset(st, 0, sizeof st);
res = 0;
int tx,ty;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cin >> g[i][j];
if(g[i][j] == '@') {
// 找到初始位置并开始dfs
tx=i,ty=j;
}
}
}
dfs(tx,ty);
cout << res << endl; // 输出可到达的瓷砖总数
}
return 0;
}
Two
#include<bits/stdc++.h>
using namespace std;
const int N=30;
int res;
int n,m;
int sx,sy;
char g[N][N];
int st[N][N];
int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};
void dfs(int x, int y) {
g[x][y]='#';
res++;
for(int i=0;i<4;i++)
{
int nx = x + dx[i], ny = y + dy[i];
if(nx>0&&ny>0&&nx<=m&&ny<=n&&g[nx][ny]=='.')
dfs(nx,ny);
}
}
int main() {
while(1) {
cin >> n >> m;
if(n == 0 && m == 0)
break;
memset(g, 0, sizeof g);
memset(st, 0, sizeof st); // 清空状态数组
res = 0; // 重置结果
for(int i = 1; i <= m; i++) {
for(int j = 1; j <= n; j++) {
cin >> g[i][j];
if(g[i][j] == '@')
sx = i, sy = j;
}
}
dfs(sx, sy);
cout << res << endl;
}
return 0;
}