fbpx

Problema #337 – Saritura_Calului – Rezolvari PBInfo

de Mihai-Alexandru

Cerinţa

Se consideră o tablă de şah cu n linii şi m coloane. La o poziţie dată se află un cal de şah, acesta putându-se deplasa pe tablă în modul specific acestei piese de şah (în L).

Să se determine o modalitate de parcurgere integrală a tablei de către calul dat, astfel încât acesta să nu treacă de două ori prin aceeaşi poziţie.

Date de intrare

Programul citește de la tastatură numerele n şi m , apoi numere x y, reprezentând dimensiunile tablei (numărul de linii şi numărul de coloane) , respectiv coordonatele iniţiale ale calului (linie, coloana).

Date de ieşire

Programul afișează n linii cu câte m numere naturale cuprinse între 1 și n*m, separate prin exact un spațiu, reprezentând parcurgerea solicitată.

Restricţii şi precizări

  • 1 ≤ n,m ≤ 6
  • 1 ≤ x ≤ n
  • 1 ≤ y ≤ m
  • pentru fiecare dintre testele propuse, există soluție

Exemplu

Date de intrare

4 5 1 1

Date de ieșire

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

int n , m , is , js , ib , jb , a[7][7] , cnt;

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

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

void afis()
{
    for(int i = 1 ; i <= n ; i++)
    {
        for(int j = 1 ; j <= m ; j++)
            cout << a[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(pas == n * m) 
            {
                afis();
                exit(0);
            }
            else back(inou , jnou , pas + 1);
            a[inou][jnou] = 0;
        }
    }
}
int main()
{
    cin >> n >> m;
    cin >> is >> js;
    a[is][js] = 1;
    back(is , js , 2);
    return 0;
}
Comentarii

S-ar putea sa iti placa