Cod sursă (job #256798)

Utilizator avatar lflorin29 Laiu Florin-Emanuel lflorin29 IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp | 1,58 kb
Rundă Arhiva de probleme Status evaluat
Dată 21 nov. 2016 21:36:04 Scor 30
#include <bits/stdc++.h>

using namespace std;

ifstream fin("immortal.in");
ofstream fout("immortal.out");

const int dx[] = { -1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
const int go_x[] = { -2, 0, 2, 0}, go_y[] = {0, 2, 0, -2};

int n, m, nr;

bool in(int i, int j) {
  return i >= 1 && j >= 1 && i <= n && j <= m;
}

const int N = 20;

vector<int>xb, yb;
bool bad[1 + N][1 + N];
vector<pair<int, int>>m_a, m_b;

void calc(int nrZ) {
  if (nrZ == 1) {
    for (int i = 0; i < (int)m_a.size(); ++i)
      fout << m_a[i].first << ' ' << m_a[i].second << ' ' << m_b[i].first << ' ' << m_b[i].second << '\n';

    exit(0);
  }

  for (int i = 0; i < xb.size(); ++i) {
    int x = xb[i], y = yb[i];

    if (!bad[x][y])
      continue;

    for (int k = 0; k < 4; ++k) {
      int nx = x + dx[k], ny = y + dy[k];

      if (in(nx, ny) && in(x + go_x[k], y + go_y[k]) && bad[nx][ny] && !bad[x + go_x[k]][y + go_y[k]]) {
        bad[x][y] = 0;
        bad[nx][ny] = 0;
        bad[x + go_x[k]][y + go_y[k]] = 1;
        m_a.emplace_back(x, y);
        m_b.emplace_back(x + go_x[k], y + go_y[k]);
        xb[i] = x + go_x[k];
        yb[i] = y + go_y[k];
        calc(nrZ - 1);
        bad[x][y] = 1;
        bad[nx][ny] = 1;
        bad[x + go_x[k]][y + go_y[k]] = 0;
        m_a.pop_back();
        m_b.pop_back();
        xb[i] = x;
        yb[i] = y;
      }
    }
  }
}

int main() {
  fin >> n >> m >> nr;

  for (int i = 0; i < nr; ++i) {
    int x, y;
    fin >> x >> y;
    xb.push_back(x);
    yb.push_back(y);
    bad[x][y] = true;
  }

  calc(nr);
}