Rezolvare completă PbInfo #2495 carioci

Pe când era la grădiniță, Maria era pasionată de colorat folosind cariocile. Într-o zi, doamna educatoare i-a dat 4 carioci (de culori diferite). I-a mai dat Mariei un număr foarte mare de cartonașe pătrate, identice ca dimensiuni. I-a spus acesteia să coloreze laturile (cele patru margini) fiecărui cartonaș, așa încât oricare cartonaș să aibă câte o latură de fiecare dintre cele 4 culori. Așa că, toată dimineața fetița a colorat.
Acum, ajungând în gimnaziu, după ce a găsit cartonașele pe care le-a colorat când era mai mică, s-a gândit la următoarea problemă: poate să așeze a x b cartonașe pe o suprafață dreptunghiulară cu a linii și b coloane, astfel încât să fie îndeplinite condițiile: fiecare dintre cele patru laturi ale zonei dreptunghiulare sa fie colorată cu o singură culoare (fiecare latură cu câte o culoare diferită); cartonașele vecine interioare să aibă latura comună de aceeași culoare.

Cerința

Pentru mai multe perechi (a,b) date, să se afișeze o posibilitate de a aranja cartonașele sau să se spună că acest lucru nu este posibil.

Date de intrare

Fișierul de intrare carioci.in conține pe prima linie un număr natural T. Pe fiecare dintre următoarele T linii, se află câte două numere naturale a și b, separate prin spațiu, reprezentând numărul de linii respectiv numărul de coloane pentru câte o zonă dreptunghiulară ce trebuie formată.

Date de ieșire

Fișierul de ieșire carioci.out va conține, în ordine pentru fiecare dintre cele T teste, fie o linie cu valoarea 0 (când așezarea nu este posibilă), fie a linii cu câte b numere (separate prin câte un spațiu). Un număr reprezintă codificarea unui cartonaș. Convenim să codificăm în felul următor: culorile le numerotăm cu numerele 1, 2, 3, 4. Codul de afișat îl formăm scriind codurile culorilor în ordinea Nord, Est, Sud, Vest. Se formează astfel un număr cu 4 cifre distincte. Acesta este codul cartonașului.

Restricții și precizări

  • 1 ≤ T ≤ 10
  • 1 ≤ a, b ≤ 100
  • Maria a colorat un număr suficient de mare de cartonașe, în toate modurile.
  • Orice soluție corectă este acceptată.

Exemplul 1:

carioci.in

2
1 1
2 2

carioci.out

1234
1234 1342
3124 4321

Exemplul 2:

carioci.in

3
1 1
1 2
2 2

carioci.out

1234
0
1234 1342
3124 4321

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 carioci:

#include <fstream>
#define DIM 102
using namespace std;

int m[DIM][DIM];
int t, a, b, i, j, pare;

inline int cod(int n, int e, int s, int v) {
    return n * 1000 + e * 100 + s * 10 + v;
}

int main () {
    ifstream fin ("carioci.in");
    ofstream fout("carioci.out");
    for (fin>>t;t--;) {
        fin>>a>>b;
        if (a%2 != b%2) {
            fout<<0<<"\n";
            continue;
        }
        pare = 0;
        if (a%2 == 0 && b%2 == 0) {
            pare = 1;
            a--;
            b--;
        }
        for (i=1;i<=a;i++)
            for (j=1;j<=b;j++) {
                if (i%2 == 1 && j%2 == 1)
                    m[i][j] = cod(1, 2, 3, 4);
                if (i%2 == 1 && j%2 == 0)
                    m[i][j] = cod(1, 4, 3, 2);
                if (i%2 == 0 && j%2 == 1)
                    m[i][j] = cod(3, 2, 1, 4);
                if (i%2 == 0 && j%2 == 0)
                    m[i][j] = cod(3, 4, 1, 2);
            }
        if (pare) {
            a++;
            b++;
            for (i=1;i<a;i++) {
                if (i%2 == 1)
                    m[i][b] = cod(1, 3, 4, 2);
                else
                    m[i][b] = cod(4, 3, 1, 2);
            }
            for (i=1;i<b;i++) {
                if (i%2 == 1)
                    m[a][i] = cod(3, 1, 2, 4);
                else
                    m[a][i] = cod(3, 4, 2, 1);
            }
            m[a][b] = cod(4, 3, 2, 1);
        }

        for (i=1;i<=a;i++) {
            for (j=1;j<=b;j++)
                fout<<m[i][j]<<" ";
            fout<<"\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 #2495 carioci

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2495 carioci 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!