Official

A - 安全なネットワーク / Safe Network Editorial by physics0523


初心者の方へ


以下の手順でこの問題に正解できます。

  • 全てのマスを for ループで巡る。
  • そのマスにサーバーが無ければ何もしない。
  • そのマスにサーバーがあれば、隣接するマスを調べる。
    • 予め \(dx=(0,0,-1,1),dy=(-1,1,0,0)\) という配列を用意してマス \((x+dx_i,y+dy_i)\) を調べることにすると実装が楽です。
    • 存在しないマスを参照しないように注意してください。 if 文を適切に使用することで範囲外参照を回避できます。
    • 隣接するマスのうちサーバーが存在するものが \(0\) 個または \(4\) 個であれば、答えは No である。
  • 答えが No になることが無ければ、答えは Yes である。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;

int dx4[4]={0,0,-1,1};
int dy4[4]={-1,1,0,0};

int main(){
  int N,M;
  cin >> N >> M;
  vector<string> S(N);
  for(auto &nx : S){cin >> nx;}
  for(int i=0;i<N;i++){
    for(int j=0;j<M;j++){
      if(S[i][j]=='.'){continue;}
      int c=0;
      for(int k=0;k<4;k++){
        int ni=i+dx4[k];
        int nj=j+dy4[k];
        if(!(0<=ni && ni<N)){continue;}
        if(!(0<=nj && nj<M)){continue;}
        if(S[ni][nj]=='#'){c++;}
      }
      if(c==0 || c==4){
        cout << "No\n";
        return 0;
      }
    }
  }
  cout << "Yes\n";
  return 0;
}