Rezolvare completă PbInfo #2479 pietre

O tablă de joc cu n linii, numerotate de la 1 la n și m coloane, numerotate de la 1 la m conține n*m celule identice. Celula din colţul din stânga sus se află pe linia 1 şi coloana 1. O celulă poate fi: celulă liberă, celulă în care se află o piatră sau celulă de tip gaură.

Pietrele sunt numerotate cu valori începând de la 1. Numerotarea pietrelor pe tablă se face în ordinea în care sunt
date în fișierul de intrare. O celulă de pe tablă are maxim patru celule vecine, aflate în direcțiile: nord, vest, sud, est, iar o piatră poate sări doar peste o celulă vecină în care se află o piatră. În urma unei astfel de sărituri, piatra peste care s-a sărit dispare de pe tablă. Astfel, o piatră situată în celula de pe linia i și coloana j, poate sări :

  1. în direcția nord peste piatra situată în celula de pe linia i-1 și coloana j și ajunge în celula de pe linia i-2 și coloana j, iar piatra aflată pe linia i-1 și coloana j dispare; o astfel de săritură se notează cu litera N;
  2. în direcția est peste piatra situată în celula de pe linia i și coloana j+1 și ajunge în celula de pe linia i și coloana j+2, iar piatra aflată pe linia i și coloana j+2 dispare; o astfel de săritură se notează cu litera E;
  3. în direcția sud peste piatra situată în celula de pe linia i+1 și coloana j și ajunge în celula de pe linia i+2 și coloana j, iar piatra aflată pe linia i+1 și coloana j dispare; o astfel de săritură se notează cu litera S;
  4. în direcția vest peste piatra situată în celula de pe linia i și coloana j-1 și ajunge în celula de pe linia i și coloana j-2, iar piatra aflată pe linia i și coloana j-1 dispare; o astfel de săritură se notează cu litera V.

O săritură a unei pietre este permisă doar dacă celula în care urmează să ajungă se află pe tabla de joc, este liberă și în celula peste care sare există o piatră.

Se cunoaște o succesiune de sărituri formată din maxim 255 de caractere S, N, E sau V, după care o piatră realizează săriturile specificate, în ordine, de la stânga la dreapta. Dacă piatra ar trebui execute o săritură care nu este permisă, poziţia ei nu se modifică şi se trece la săritura următoare din succesiune.

Cerința

Să se determine numărul pietrei care efectuând sărituri în conformitate cu succesiunea dată, conduce la o configuraţie finală formată dintr-un număr minim de pietre pe tablă. Dacă există mai multe pietre care ar conduce la acelaşi număr minim de pietre în configuraţia finală, se va afişa valoarea cea mai mică dintre numerele de identificare ale pietrelor respective.

Date de intrare

p Fişierul de intrare pietre.in va conţine:

  1. pe prima linie din fişier numărul natural n care reprezintă numărul de linii, numărul natural m care reprezintă numărul de coloane, numărul natural de pietre k și numărul natural de găuri g, valori separate între ele două câte două printr-un spațiu;
  2. pe următoarele k linii, câte două valori separate două câte două printr-un spaţiu, reprezentând linia și coloana unei pietre;
  3. pe următoarele g linii, câte două valori separate două câte două printr-un spațiu, reprezentând linia și coloana unei găuri;
  4. pe ultima linie se află succesiunea de sărituri.

Date de ieșire

Fișierul de ieşire pietre.out va conţine:

  1. pe prima linie numărul pietrei căreia aplicându-i-se succesiunea de sărituri conduce la configuraţia conţinând cel mai mic număr de pietre;
  2. pe a doua linie se află numărul de pietre din configuraţia finală (fie acesta t);
  3. pe următoarele t linii se află câte două valori, separate între ele printr-un spațiu, reprezentând linia și coloana fiecărei pietre rămase pe tablă, începând cu cea mai de sus (linia cea mai mică) și coloana cea mai din stânga (coloana cea mai mică) și până la piatra cea mai de jos cu linia cea mai de jos (cea mai mare) și coloana cea mai din dreapta (cea mai mare).

Restricții și precizări

  • 2 ≤ n,m ≤ 100
  • 2 ≤ k ≤ n*m-1
  • 0 ≤ g ≤ n*m-1
  • Se garantează că în fiecare test există cel puţin o piatră care efectuează cel puțin o săritură.

Exemplu

pietre.in

5 4 6 2
1 1
1 2
2 2
3 2
3 3
4 1
3 4
5 3
VSE

pietre.out

5
4
1 1
1 2
2 2
5 1

Explicație

Piatra 1: nu poate efectua săritura V (deoarece ar părăsi tabla de joc), nici săritura S (pentru că nu există nicio piatră în celula vecină aflată în direcția sud), efectuează săritura E, deci configurația finală a tabelei va conține 5 pietre.
Pentru piatra 2 se obține configurația finală identică celei inițiale, deoarece nu poate efectua nicio săritură.
Piatra 3 poate efectua doar săritura S. Configurația finală conține 5 pietre.
Piatra 4 nu poate efectua nicio săritură. Configurația finală conține 6 pietre.
Piatra 5 poate efectua săriturile: V și dispare piatra 4, S și dispare piatra și nu poate efectua săritura E. Configurația finală are 4 pietre.
Piatra 6 nu poate efectua nicio săritură. Configurația finală conține 6 pietre.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema pietre:

# include <bits/stdc++.h>
using namespace std;

ifstream f ("pietre.in");
ofstream g ("pietre.out");

;
struct piatra{
    short x, y;
}P[10002], sol[10002];

short A[103][103], B[103][103];
int n, m, k, G, Min = 10000, nr_p, t;
char mut[256];

int main()
{
    int i, j, x, y, l, c, M, del;
    f >> n >> m >> k >> G;
    for(i=1; i<=k; ++i) {
        f >> x >> y;
        A[x][y] = 1;
        P[i].x = x; P[i].y = y;
    }
    while(G--) {
        f >> x >> y;
        A[x][y] = -1;
    }
    f.get();
    f.get(mut, 256);
    M = strlen(mut);

    for(i=1 ;i<=k; ++i){
        memcpy(B, A, sizeof(A));
//        for(l=1; l<=n; ++l){
//            for(c=1; c<=m; c++)
//                g << B[l][c];
//            g << '\n';
//        }
//        g << '\n';
        l = P[i].x; c = P[i].y;
        del = k;
        for(j=0; j<M; ++j) {
            if (mut[j] == 'N') {
                if (l - 2 > 0)
                if (B[l-1][c] == 1 && B[l-2][c] == 0) {
                    B[l][c] = 0;
                    B[l-1][c] = 0;
                    B[l-2][c] = 1;
                    l = l-2;
                    del--;
                }
            }
            if (mut[j] == 'E') {
                if (c+2 <= m)
                if (B[l][c+1] == 1 && B[l][c+2] == 0) {
                    B[l][c] = 0;
                    B[l][c+1] = 0;
                    B[l][c+2] = 1;
                    c = c+2;
                    del--;
                }
            }
            if (mut[j] == 'S') {
                if (l+2 <= n)
                if (B[l+1][c] == 1 && B[l+2][c] == 0) {
                    B[l][c] = 0;
                    B[l+1][c] = 0;
                    B[l+2][c] = 1;
                    l = l+2;
                    del--;
                }
            }
            if (mut[j] == 'V'){
                if (c-2 > 0)
                if (B[l][c-1] == 1 && B[l][c-2] == 0) {
                    B[l][c] = 0;
                    B[l][c-1] = 0;
                    B[l][c-2] = 1;
                    c = c-2;
                    del--;
                }
            }
        }
//        for(l=1; l<=n; ++l){
//            for(c=1; c<=m; c++)
//                g << B[l][c];
//            g << '\n';
//        }
//        g << '\n';
        if (del < Min) {
            Min = del;
            nr_p = i;
            t = 0;
            for(l=1; l<=n; l++)
                for(c=1; c<=m; c++)
            if (B[l][c] == 1) {
                sol[++t].x = l;
                sol[t].y = c;
            }
        }
    }
    g << nr_p << '\n';
    g << t << '\n';
    for(i=1; i<=t; ++i)
        g << sol[i].x << ' ' << sol[i].y << '\n';
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2479 pietre

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2479 pietre de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!