ROBOCON - VOI 2012 Robocon
Tác giả: ladpro98
Ngôn ngữ: C++
#include <cstring>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <memory.h>
#include <cassert>
#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define REP(i, a, b) for(int i = (a); i <=(b); i++)
#define FORD(i, a, b) for(int i = (a); i > (b); i--)
#define REPD(i, a, b) for(int i = (a); i >=(b); i--)
#define SZ(a) (int((a).size()))
#define ALL(a) (a).begin(), (a).end()
#define PB push_back
#define MP make_pair
#define LL long long
#define LD long double
#define II pair<int, int>
#define X first
#define Y second
#define VI vector<int>
const int N = 505;
const int NN = 15 * N * N;
const int dx1[] = {0, 1, 1};
const int dy1[] = {1, 1, 0};
const int dx2[] = {0, 1, 1};
const int dy2[] = {-1, -1, 0};
using namespace std;
II Q1[NN], Q2[NN];
bool block[N][N], was1[N][N], was2[N][N];
int n, k, l1, r1, l2, r2;
bool out(II u)
{return u.X < 1 || u.Y < 1 || u.X > n || u.Y > n || block[u.X][u.Y];}
void bfs1() {
int tmp = r1;
while (l1 <= r1) {
II u = Q1[l1++];
FOR(i, 0, 3) {
II v (u.X + dx1[i], u.Y + dy1[i]);
if (out(v)) continue;
if (!was1[v.X][v.Y]) {
was1[v.X][v.Y] = 1;
Q1[++tmp] = v;
}
}
}
r1 = tmp;
}
bool bfs2() {
int tmp = r2;
while (l2 <= r2) {
II u = Q2[l2++];
FOR(i, 0, 3) {
II v (u.X + dx2[i], u.Y + dy2[i]);
if (out(v)) continue;
if (was1[v.X][v.Y]) return true;
if (!was2[v.X][v.Y]) {
was2[v.X][v.Y] = 1;
Q2[++tmp] = v;
}
}
}
r2 = tmp;
return false;
}
int main() {
ios :: sync_with_stdio(0); cin.tie(0);
cin >> n >> k;
int u, v;
FOR(i, 0, k) {
cin >> u >> v;
block[u][v] = 1;
}
l1 = r1 = 1; Q1[1] = II(1, 1);
l2 = r2 = 1; Q2[1] = II(1, n);
FOR(step, 1, n * n) {
bfs1();
if (bfs2()) {cout << step; break;}
REP(i, l1, r1) was1[Q1[i].X][Q1[i].Y] = 0;
REP(i, l2, r2) was2[Q2[i].X][Q2[i].Y] = 0;
}
return 0;
}