yokobuttonの不定期で競技プログラミングをするブログ

不定期で解けた競技プログラミングコンテストの問題を載せています。

NOMURA プログラミングコンテスト2022(AtCoder Beginner Contest 253)B - Distance Between Tokens

問題の要約
H行W列のマス目があり、そのうち二つの異なるマスに駒が置かれている。
マス目の状態はH個の長さWの文字列S1,...,SHで表される。Si,j=oならばi行目j列目のマスに駒が置かれていることを、Si,j=-ならばそのマスには駒が置かれていないことを表す。
一方の駒をマス目の外側に出ないように上下左右の隣接するマスに動かすことを繰り返すとき、もう一方の駒と同じマスに移動させるためには最小で何回動かす必要があるか?


制約
2<=H,W<=100


入力
H W
S1
...
SH


考え方
1,駒があるマスの行番号をy1,y2、列番号をx1,x2とする。
2,x1<=x2およびy1<=y2になるように値を交換する。
3,x2-x1+y2-y1が答え。


実際のプログラム
#include<iostream>
#include<vector>
#include<string>

using namespace std;

int main(){
  int H,W;
  cin >> H >> W;
  
  vector<string> S(H);
  for(int i = 0; i < H; ++i){
    cin >> S[i];
  }
  
  int x1,x2,y1,y2;
  int check = 0;
  for(int i = 0; i < H; ++i){
    for(int j = 0; j < W; ++j){
      if(S[i][j] == '-'){
        continue;
      }
      if(check == 0){
        x1 = j;
        y1 = i;
        check = 1;
      }else if(check == 1){
        x2 = j;
        y2 = i;
        check = 2;
      }
    }
  }
  
  if(x1 > x2){
    swap(x1,x2);
  }
  if(y1 > y2){
    swap(y1,y2);
  }
  
  cout << x2-x1+y2-y1 << endl;
  
  return 0;
}