链接:四面楚歌
来源:牛客网
题目描述
在游戏中,因为一次错误的决断,你的士兵被敌方实行围剿。为了挽回人员损失,你不得不开启金手指暂停敌方士兵的移动,从而尽量让自己的士兵能成功突围。
已知地图是一块 n × m n \times m n×m的区域,每块格子有以下几种类型:
.
:表示此处为一块空地。
1
:表示此处有敌方士兵,不许通过。因为开启了金手指,所以敌方士兵不会移动。
0
:表示此处有我方士兵。
现规定我方士兵只能进行上/下/左/右四个方向的移动,只要某个士兵移动出了地图边界,那么就算该士兵突围成功。请问能有多少士兵成功突围。
输入描述:
输出描述:
输入
4 5
111..
101..
111..
..0..
输出
1
题解
#include <bits/stdc++.h>
using namespace std;
char mg[1010][1010];
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int n, m, ans, xi, yi;
void dfs(int x, int y) {
for (int i = 0; i <= 3; i++) { //顺时针遍历四周
xi = x + dx[i], yi = y + dy[i];
if (xi >= 0 && xi <= n + 1 && yi >= 0 && yi <= m + 1 && mg[xi][yi] != '1') {
//迷宫范围内&没敌人
if (mg[xi][yi] == '0')
ans++;
mg[xi][yi] = '1'; // flag
dfs(xi, yi);
}
}
}
int main() {
cin >> n >> m; // n*m的迷宫 1~n 1~m
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> mg[i][j];
}
}
dfs(0, 0); //从墙开始
cout << ans << endl;
return 0;
}