読者です 読者をやめる 読者になる 読者になる

日々精進

aikoと旅行とプログラミング

【AOJ 2253】Brave Force Story

問題

Brave Force Story | Aizu Online Judge

方針

  • BFSをする.
  • その際にそこにたどり着ける距離を保存し, 最後にたどり着けたマスの数を数える.
  • 普通に探索するとインデックスが負になって悲しくなるので, 適当に座標をずらす.

コード

#include <algorithm>
#include <iostream>
#include <queue>
 
using namespace std;
 
#define INF 1<<20
#define rep(i, n) REP(i,0,n)
#define REP(i,a,n) for(int i = a; i < (int)n ; i++)
 
bool barrier[200][200];
int d[200][200];
int dx[] = {0,  0, -1, -1, 1, 1};
int dy[] = {1, -1,  0, -1, 0, 1};
 
struct NODE{
  int x_, y_, d_;
  NODE(int x, int y, int d){
    x_ = x; y_ = y; d_ = d;
  }
};
 
 
int solve(int x, int y, int turn){
  queue<NODE> que;
  que.push(NODE(x, y, 0));
   
  d[x][y] = 0;
 
  while(!que.empty()){
    NODE p = que.front(); que.pop();
     
    if(p.d_ >= turn) continue;
     
    d[p.x_][p.y_] = p.d_;
 
    rep(i, 6){
      int nx = p.x_ + dx[i]; int ny = p.y_ + dy[i];
      if(nx < 0 || 200 <= nx || ny < 0 || 200 <= ny || d[nx][ny] <= p.d_+1 || barrier[nx][ny]) continue;
      d[nx][ny] = p.d_+1;
      que.push(NODE(nx, ny, p.d_+1));
    }
  }
   
  int ans = 0;
  rep(i, 200){
    rep(j, 200){
      if(d[i][j] != INF) ans++;
    }
  }
  queue<NODE>().swap(que); 
  return ans;
}
 
signed main(){
  int t, n;
   
  while(cin >> t >> n, t || n){
    int x, y;
 
    rep(i, 200){
      rep(j, 200){
    barrier[i][j] = false;
    d[i][j] = INF;
      }
    }
 
    rep(i, n){
      cin >> x >> y;
      barrier[x+100][y+100] = true;
    }
     
    cin >> x >> y;
    cout << solve(x+100, y+100, t) << endl;
  }
   
  return 0;
}