Cod sursa(job #3306052)

Utilizator petric_mariaPetric Maria petric_maria Data 7 august 2025 00:04:07
Problema Multiplu Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.76 kb
#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;
}