题意是说 从@出发,最远可以走多少步,通过DFS遍历这个矩阵即可,注意这个DFS不同于一般的DFS有一个终止条件,通过终止条件退出递归,而是通过设立visit数组为true,最终确保遍历完所有可以抵达的点后 退出DFS
//leehaoze
#include <iostream>
#include <deque>
#include <string>
#include <vector>
#include <queue>
#include <cstdio>
#include <stack>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
const int INF = 1 << 29;
#define INC_SAT(val) (val = ((val)+1 > (val)) ? (val)+1 : (val))
#define ARR_SIZE(a) ( sizeof( (a) ) / sizeof( (a[0]) ) )
#define ULL unsigned long long
#define MAXN (20 + 5)
struct Point {
Point() {}
Point(int x, int y) : x_(x), y_(y){}
int x_, y_;
};
int Move_X[] = {0, 0, 1,-1};
int Move_Y[] = {1,-1, 0, 0};
char map[MAXN][MAXN];
bool visit[MAXN][MAXN];
int W, H, ans;
Point start;
bool Input() {
cin >> W >> H;
if (W == 0 && H == 0)return false;
for (int i = 0; i < H; ++i) {
for (int j = 0; j < W; ++j) {
cin >> map[i][j];
visit[i][j] = false;
if (map[i][j] == '@') {
start.x_ = i;
start.y_ = j;
}
}
}
ans = 1;
return true;
}
bool Legal(int dx,int dy){
return dx >= 0 && dx < H && dy >= 0 && dy < W && !visit[dx][dy] && map[dx][dy] == '.';
}
void DFS(Point now) {
for (int i = 0; i < 4; ++i) {
int dx = now.x_ + Move_X[i];
int dy = now.y_ + Move_Y[i];
if(Legal(dx,dy)){
visit[dx][dy] = true;
++ans;
DFS(Point(dx,dy));
}
}
}
int main() {
#ifdef LOCAL
freopen("IN.txt", "r", stdin);
#endif
std::ios::sync_with_stdio(false);
while(Input()){
visit[start.x_][start.y_] = true;
DFS(start);
cout << ans << endl;
}
}
还顺手写了一个BFS的版本,但是效率不如DFS的快
//leehaoze
#include <iostream>
#include <deque>
#include <string>
#include <vector>
#include <queue>
#include <cstdio>
#include <stack>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
const int INF = 1 << 29;
#define INC_SAT(val) (val = ((val)+1 > (val)) ? (val)+1 : (val))
#define ARR_SIZE(a) ( sizeof( (a) ) / sizeof( (a[0]) ) )
#define ULL unsigned long long
#define MAXN (20 + 5)
struct Point {
Point() {}
Point(int x, int y) : x_(x), y_(y){}
int x_, y_;
};
int Move_X[] = {0, 0, 1,-1};
int Move_Y[] = {1,-1, 0, 0};
char map[MAXN][MAXN];
bool visit[MAXN][MAXN];
int W, H, ans;
Point start;
bool Input() {
cin >> W >> H;
if (W == 0 && H == 0)return false;
for (int i = 0; i < H; ++i) {
for (int j = 0; j < W; ++j) {
cin >> map[i][j];
visit[i][j] = false;
if (map[i][j] == '@') {
start.x_ = i;
start.y_ = j;
}
}
}
ans = 1;
return true;
}
bool Legal(int dx,int dy){
return dx >= 0 && dx < H && dy >= 0 && dy < W && !visit[dx][dy] && map[dx][dy] == '.';
}
void BFS(){
queue<Point> Q;
Q.push(start);
while(!Q.empty()){
Point now = Q.front();
Q.pop();
for (int i = 0; i < 4; ++i) {
int dx = now.x_ + Move_X[i];
int dy = now.y_ + Move_Y[i];
if(Legal(dx,dy)){
visit[dx][dy] = true;
++ans;
Q.push(Point(dx,dy));
}
}
}
}
int main() {
#ifdef LOCAL
freopen("IN.txt", "r", stdin);
#endif
std::ios::sync_with_stdio(false);
while(Input()){
visit[start.x_][start.y_] = true;
BFS();
cout << ans << endl;
}
}