Rezolvare completă PbInfo #1021 Cartite

Cârtițele sunt animale de dimensiuni mici care își duc traiul pe suprafețe de teren deschis, având ca dușman principal vulpea. Lângă o pădure se află o zonă agricolă în forma dreptunghiulară, împărțită în pătrățele de aceeași dimensiune. Zona agricolă este reprezentată printr-un tablou bidimensional cu M linii și N coloane, având liniile și coloanele numerotate începând cu 1. În aceasta zona agricolă trăiește o cârtiță și K vulpi.

Pentru cârtiță cunoaștem coordonatele ei (linia și coloana) pe care se găsește, la fel și pentru vulpi, care stau la pânda pentru a ataca cârtita în momentele ei de neatenție.
Pe suprafața terenului cârtita se poate deplasa din pătrățelul în care se afla doar într-unul dintre cele 4 pătrățele vecine pe direcțiile nord, sud, est sau vest.
Vulpile pot ataca instantaneu pe o raza de acțiune de lungime 0, 1 sau 2 pe orizontala și verticala, inclusiv în poziția unde se găsesc, după care tot instantaneu se întorc în pozițiile inițiale. În figura de mai jos sunt desenate pătrățele unde poate ataca o vulpe poziționață în pătrățelul cu cifra reprezentând raza de acțiune.

Pentru a micșora riscul de deplasare în zona agricolă cârtița sapă în pământ un sistem de G galerii, care leagă între ele pătrățele din zona agricola. Aceste galerii nu se intersectează sub pământ, ci doar la suprafață, trecerea dintr-o galerie în alta, care se intersectează în același pătrățel făcându-se printr-un sistem ce nu îi pune viata în pericol. Galeriile sunt indicate prin coordonatele pătrățelelor pe care le unesc. Acestea sunt săpate astfel încât, dacă pornim dintr-un capăt al unei galerii le putem parcurge pe toate. Nu exista doua galerii care sa pornească din același pătrățel și să ajungă tot în același pătrățel (galeriile sunt distincte).

Cârtița dorește sa se plimbe prin toate galeriile de sub teren trecând o singura data prin fiecare, dar pentru acest lucru trebuie sa ajungă nevătămată mergând la suprafața terenului la un pătrățel de unde să intre în sistemul de galerii.

Cerința

Determinați:

1. cel mai apropiat pătrățel de poziția inițială a cârtitei prin care ea poate să intre în galerie pentru a se plimba, precum și lungimea traseului parcurs la suprafață astfel încât fiecare pătrățel de pe traseu sa nu fie atacat de nicio vulpe;
2. traseul de plimbare numai prin galerii, specificat prin coordonatele pătrățelelor care constituie capetelor acestora.

Date de intrare

Fișierul de intrare cartite.in conține pe prima linie un număr natural p, care poate avea doar valoarea 1 sau valoarea 2. Pe a doua linie se afla numerele naturale M și N, reprezentând dimensiunile zonei agricole. Pe a treia linie se afla xc yc, coordonatele cârtitei. Pe linia a patra se afla numărul de vulpi K, apoi urmează K linii cu câte trei numere naturale reprezentând coordonatele pătrățelelor unde se găsesc vulpi și raza lor de acțiune (0, 1 sau 2). Următoarea linie conține numărul de galerii G. Fiecare dintre următoarele G linii conține câte 4 numere naturale separate prin câte un spațiu, reprezentând coordonatele capetelor unei galerii.

Date de ieșire

Dacă valoarea lui p este 1, se va afișa numai rezultatul de la cerința 1. În acest caz, în fișierul de ieșire cartite.out se vor scrie trei numere naturale separate între ele prin câte un spațiu, reprezentând coordonatele pătrățelului unde va intra cârtita în galerii și lungimea traseului parcurs la suprafață.

Dacă valoarea lui p este 2, se va afișa numai rezultatul de la cerința 2. În acest caz, fișierul de ieșire cartite.out va conține coordonatele pătrățelelor traseului de plimbare prin galerii (coordonatele câte unui pătrățel pe câte o linie, începând cu prima linie a fișierului de ieșire). Pătrățelul de pornire trebuie sa fie același cu cel în care ajunge cârtita la sfârșitul plimbării și nu este obligatoriu sa fie același cu cel în care ea intra în galerii de la suprafața terenului.

Restricții

  • 1 ≤ M,N ≤ 200
  • 1 ≤ G ≤ 100
  • 0 ≤ K ≤ 50
  • Lungimea traseului parcurs la suprafață este egală cu numărul de pătrățele prin care aceasta trece, dar diferite de cel din care pleacă.
  • Fiecare dintre cerințe reprezinta 50% din punctaj.
  • Cârtita nu poate intra în galerii printr-un pătrățel din raza de acțiune a unei vulpi.
  • Pentru toate testele exista soluție la cerința a), adică exista un traseu sigur de la cârtiță la o intrare într-o galerie.
  • Soluția, nu este unica, însa, orice soluție corecta va obține punctajul maxim pe test.
  • Inițial, cârtita se găsește pe o poziție în care nu este atacata de nicio vulpe.

Exemplu 1

cartite.in

1
6 4
6 3
3
5 1 0
3 4 1
4 3 0
7
1 1 3 2
1 3 1 4
1 1 3 3
1 4 4 2
4 2 3 3
4 2 1 3
4 2 3 2

cartite.out

4 2 3

Exemplu 2

cartite.in

2
6 4
6 3
3
5 1 0
3 4 1
4 3 0
7
1 1 3 2
1 3 1 4
1 1 3 3
1 4 4 2
4 2 3 3
4 2 1 3
4 2 3 2

cartite.out

1 1
3 2
4 2
1 3
1 4
4 2
3 3
1 1

Explicație

Primul exemplu:

Deplasarea cârtiţei pe suprafaţa agricolă se va face pe traseul de lungime 3 ce trece prin pătrăţelele (6,3) (6,2) (5,2) (4,2). Coordonatele pătrăţelului de intrare în galerii sunt (4,2).
Atenţie! Pentru acest test se va afişa doar rezultatul la cerinţa a).

Al doilea exemplu:

Traseul de plimbare prin galerii este următorul: (1,1) (3,2) (4,2) (1,3) (1,4) (4,2) (3,3) (1,1), cu observația că se putea alege și alt pătrățel de plecare.
Atenție! Pentru acest test se va afișa doar rezultatul la cerința b).

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

#include <cstdio>
#include <vector>
#define N 1<<16
#define I(x,y) (x<<8)|y
#define Afis(x) printf("%d %d\n",x>>8,x&255)
using namespace std;
int n,m,i,j,X,Y,vulpe=-1,capat=-2,baza,top,vulpi[N],capete[N],Lee[N],Q[N],k,p,e,
D[5]={-256,256,-1,1,0},*d,x[1001],y[1001],used[1001],cx,cy,lg,caz;
vector<int> v[N];
void fill(int,int),DF(int);
int main()
{
    freopen("cartite.in","r",stdin);
    freopen("cartite.out","w",stdout);
    scanf("%d",&caz);
    scanf("%d%d",&n,&m);m++;n++;
    scanf("%d%d",&i,&j);X=I(i,j);
    for(j=0;j<=m;j++)vulpi[I(0,j)]=vulpi[I(n,j)]=1;
    for(i=0;i<=n;i++)vulpi[I(i,0)]=vulpi[I(i,m)]=1;
    scanf("%d",&k);
    for(;k;k--){scanf("%d%d%d",&i,&j,&p);fill(I(i,j),p);}
    scanf("%d",&e);
    for(k=1;k<=e;k++)
    {
        scanf("%d%d",&i,&j);
        x[k]=I(i,j);v[x[k]].push_back(k);
        scanf("%d%d",&i,&j);
        y[k]=I(i,j);v[y[k]].push_back(k);
        capete[x[k]]=capete[y[k]]=1;
    }
    Q[1]=X;top=1;Lee[X]=1;
    for(baza=1;baza<=top;baza++)
    {
        i=Q[baza];
        for(d=D;*d;d++)
        {
            if(vulpi[i+*d])continue;
            if(Lee[i+*d])continue;
            Lee[i+*d]=Lee[i]+1;
            Q[++top]=i+*d;
            if(capete[i+*d])break;
        }
        if(capete[i+*d])
        {
            cx=(i+*d)>>8;
            cy=(i+*d)&255;
            lg=Lee[i+*d]-1;
            break;
        }
    }
    if(caz==1)
    {
        printf("%d %d %d\n",cx,cy,lg);
        return 0;
    }
 
    for(i=1;i<=e;i++)
    {
        if(!vulpi[x[i]]){DF(x[i]);break;}
        if(!vulpi[y[i]]){DF(x[i]);break;}
    }
    return 0;
}
void DF(int nod)
{
    for(;v[nod].size();)
    {
        int edge=v[nod].back();
        if(used[edge]){v[nod].pop_back();continue;}
        used[edge]=1;
        DF(x[edge]+y[edge]-nod);
    }
    Afis(nod);
}
void fill(int x,int y)
{
    int *q;
    if(x<0||y<0)return;
    if(vulpi[x])return;
    vulpi[x]=1;
    for(q=D;*q;q++)fill(x+*q,y-1);
}

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 #1021 Cartite

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