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șierultraseucalmax.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; }