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 a tablei de către calul dat, astfel încât acesta să nu treacă de două ori prin aceeaşi poziţie. Parcurgerea constă într-o matrice cu n linii și m coloane, fiecare element al matricei având valoarea pasului la care se ajunge în acel element, sau 0, dacă nu s-a ajuns.
Date de intrare
Fișierul de intrare saritura_calului1.in conține 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
Fișierul de ieșire saritura_calului1.out va conține 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 ≤ 1001 ≤ istart ≤ n1 ≤ jstart ≤ m- scorul obținut pe fiecare test este proporțional cu gradul de acoperire a tablei. Astfel, dacă tabla este acoperită în întregime, se acordă 100% din punctaj. Dacă tabla este acoperită în proporție de 70%, se acordă 70% din punctaj, etc.
Exemplul 1
saritura_calului1.in
4 5 1 1
saritura_calului1.out
1 12 7 16 3 6 17 2 11 8 13 10 19 4 15 18 5 14 9 20
Explicație
Parcurgerea este completă, se va acorda 100% din punctaj.
Exemplul 2
saritura_calului1.in
4 5 1 1
saritura_calului1.out
1 12 7 16 3 6 0 2 11 8 13 10 0 4 15 0 5 14 9 0
Explicație
Parcurgerea este parțială. S-au făcut 16 pași din 20, se va acorda 80% din punctaj.
#include <bits/stdc++.h>
using namespace std;
const int di[] = {-1,1,2,2,1,-1,-2,-2};
const int dj[] = {2,2,1,-1,-2,-2,-1,1};
int n , m , x , y , a[205][205] , gata;
ifstream cin("saritura_calului1.in");
ofstream cout("saritura_calului1.out");
void afis()
{
for(int i = 1 ; i <= n ; i++)
{
for(int j = 1 ; j <= m ; j++)
cout << a[i][j] << " ";
cout<<'\n';
}
gata = 1;
}
int inside(int i , int j)
{
return i >= 1 && i <= n && j >= 1 && j <= m;
}
int pozdisponibile(int i, int j)
{
int cnt = 0;
for(int d = 0 ; d < 8 ; d++)
{
int inou = i + di[d];
int jnou = j + dj[d];
if(inside(inou , jnou) && a[inou][jnou] == 0) cnt++;
}
return cnt;
}
void calgreedy(int i, int j, int pas)
{
int val , mini = 9999999 ,ii,jj;
if(!gata)
{
a[i][j] = pas;
if(pas == n * m) afis();
else for(int d = 0 ; d < 8 ; d++)
{
int inou = i + di[d];
int jnou = j + dj[d];
if(inside(inou , jnou) && a[inou][jnou] == 0)
{
val = pozdisponibile(inou , jnou);
if(val <= mini) mini = val , ii = inou , jj = jnou;
}
}
if(mini != 99999) calgreedy(ii , jj , pas + 1);
a[i][j] = 0;
}
}
int main()
{
cin>> n >> m >> x >> y;
calgreedy(x , y , 1);
return 0;
}