0
点赞
收藏
分享

微信扫一扫

牛客 四面楚歌

天蓝Sea 2022-04-06 阅读 85
算法

链接:四面楚歌
来源:牛客网

题目描述

在游戏中,因为一次错误的决断,你的士兵被敌方实行围剿。为了挽回人员损失,你不得不开启金手指暂停敌方士兵的移动,从而尽量让自己的士兵能成功突围。

已知地图是一块 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;
}

举报

相关推荐

0 条评论