Pagini recente » Cod sursa (job #1280387) | Cod sursa (job #1639358) | Cod sursa (job #3247095) | Cod sursa (job #392198) | Cod sursa (job #3306052)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lacuri.in");
ofstream g("lacuri.out");
int n, a[105][105], m[105][105], ans = 0, v[105][105];
bool ok = true;
int dx[] = {0, -1, 0, 1};
int dy[] = {-1, 0, 1, 0};
queue <pair <int, int>> q;
bool vrf (int i, int j) {
return (i==n || i < n && a[i+1][j] == 0) && (j==n || j < n && a[i][j+1] == 0);
}
bool vrf2 (int i, int j) {
return i >= 1 && i <= n && j >= 1 && j <= n;
}
void bfs () {
v[1][1] = 1;
q.push ({1, 1});
while (!q.empty()) {
pair <int, int> k;
k = q.front(); q.pop();
for (int i=0; i<4; ++i) {
int x = k.first + dx[i];
int y = k.second + dy[i];
if (vrf2(x, y) && a[x][y] == 0 && (v[x][y] == 0 || v[x][y] > v[k.first][k.second] + 1)){
v[x][y] = v[k.first][k.second] + 1;
q.push ({x, y});
}
}
}
}
void afisare (int i, int j) {
if (i > 1 || j > 1) {
bool t = true;
for (int k=0; k<4 && t; ++k) {
int x = i + dx[k];
int y = j + dy[k];
if (vrf2 (x, y) && v[x][y] == v[i][j] - 1)
t = false;
if (!t)
afisare (x, y);
}
}
g << i << ' ' << j << '\n';
}
int main()
{
f >> n;
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j)
f >> a[i][j];
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j) {
if (a[i][j] == 0)
m[i][j] = 0;
else
m[i][j] = m[i][j-1] + 1;
}
for (int i=n; i>=1; --i)
for (int j=n; j>=1; --j)
if (a[i][j] == 1) {
if (vrf (i, j)) {
bool t = true;
//cout << i << ' ' << j << endl;
int aux = m[i][j], k = i;
while (k >= 1 && a[k][j]) {
if (m[k][j] != aux || (j < n && a[k][j+1] == 1))
t = false;
k --;
}
if (m[i][j] != i - k)
t = false;
if (!t)
ok = false;
else{
if (i < n) {
for (k = j; k > j - m[i][j]; k--)
if (m[i+1][k] == 1)
t = false;
}
if (t)
ans ++;
else
ok = false;
}
}
}
g << ans << '\n';
if (ok) {
bfs ();
afisare (n, n);
}
return 0;
}