fbpx

Problema #2244 – TraseuCalMax – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se dă o tablă de șah formată din n linii și m coloane, definind n*m zone, unele dintre ele fiind libere, altele conținând obstacole. În zona de coordonate 1 1 se află un cal care se poate deplasa pe tablă în L, ca la șah (doi pași pe o direcție și un pas pe cealaltă direcție), fără a părăsi tabla, fără a trece prin zone care conțin obstacole și fără a trece de două ori prin aceeași zonă.

Determinați un traseu cu număr maxim de zone prin care calul poate ajunge în zona de coordonate n m – unde se află o căpiță de fân.

Date de intrare

Fişierul de intrare traseucalmax.in conţine pe prima linie numerele n m, separate printr-un spațiu. Următoarele n linii conțin câte m valori, care descriu tabla: 0 corespunde unei zone libere, caracterul 1 corespunde unei zone ocupate de un obstacol.

Date de ieşire

Fişierul de ieşire traseucalmax.out va conţine n linii, pe fiecare linie fiind câte m numere, care descriu traseul calului, astfel:

  • zonelor prin care nu va trece calul le corespund valoarea 0.
  • zonei în care se află inițial calul îi corespunde valoarea 1
  • următoarei zone din traseul calului îi corespunde valoarea 2
  • fiecărei zone din traseul calului îi corespunde o valoare număr natural semnificând la al câtelea pas ajunge calul în acea zonă.

Numerele de pe fiecare linie fișierului de ieșire sunt separate prin exact un spațiu.

Restricţii şi precizări

  • 1 ≤ n,m ≤ 10
  • zona în care se află calul și zona în care trebuie să ajungă sunt libere
  • dacă nu există nicio modalitate prin care calul va ajunge la căpița de fân toate cele n*m numere din fișierul traseucalmax.out vor fi zero.
  • oricare traseu valid al calului este considerat corect

Exemplu

traseucalmax.in

4 5
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 1 0

traseucalmax.out

1 4 0 8 0 
12 9 0 3 0 
5 2 13 10 7 
0 11 6 0 14 
#include <bits/stdc++.h>
using namespace std;

ifstream cin("traseucalmax.in");
ofstream cout("traseucalmax.out");

int n , m , is , js , ib , jb , a[11][11] , cnt , b[11][11] , maxi;

const int dic[] = {-2 , -2 , -1 , 1 , 2 ,  2 ,  1 , -1};
const int djc[] = {-1 ,  1 ,  2 , 2 , 1 , -1 , -2 , -2};

int inside(int i , int j)
{
    return i >= 1 && i <= n && j >= 1 && j <= m;
}

void copie()
{
    for(int i = 1 ; i <= n ; i++)
        for(int j = 1 ; j <= m ; j++)
            b[i][j] = a[i][j];
    cnt++;
}

void afis()
{
    for(int i = 1 ; i <= n ; i++)
    {
        for(int j = 1 ; j <= m ; j++)
        if(b[i][j] == -1) cout << 0 << " ";
            else cout << b[i][j] << " ";
        cout << '\n';
    }
}

void back(int i , int j , int pas)
{
    for(int d = 0 ; d < 8 ; d++)
    {
        int inou = i + dic[d];
        int jnou = j + djc[d];
        if(inside(inou , jnou) && a[inou][jnou] == 0)
        {
            a[inou][jnou] = pas;
            if(inou == n && jnou == m && pas > maxi)
            {
                maxi = pas;
                copie();
            }
            else back(inou , jnou , pas + 1);
            a[inou][jnou] = 0;
        }
    }
}
int main()
{
    cin >> n >> m;
    for(int i = 1 ; i <= n ; i++)
        for(int j = 1 ; j <= m ; j++)
            cin >> a[i][j] , a[i][j] = -a[i][j];

    a[1][1] = 1;
    back(1 , 1 , 2);
    afis();
    if(cnt == 0)
        for(int i = 1 ; i <= n ; i++)
        {
            for(int j = 1 ; j <= m ; j++)
                cout << 0 << " ";
            cout << '\n';
        }
    return 0;
}
Comentarii

S-ar putea sa iti placa