Cerinţa
Se dă o tablă dreptunghiulară formată din n
linii și m
coloane, definind n*m
zone, unele dintre ele fiind libere, altele conținând obstacole. În zona aflată la poziția is
, js
se află un șoarece care se poate deplasa pe tablă trecând din zona curentă în zona învecinată cu aceasta pe linie sau pe coloană. Scopul sau este să ajungă la o bucată de brânză aflată în zona de la poziția ib
, jb
, 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 câte modalități prin care șoarecele poate ajunge de la poziția inițială la cea a bucății de brânză există.
Date de intrare
Fişierul de intrare soarece.in
conţine pe prima linie numerele n m
, separate printr-un spațiu. Următoarele n
linii conțin câte m
valori 0
sau 1
, separate prin exact un spațiu, care descriu tabla – valoarea 0
reprezintă o zonă liberă, valoarea 1
reprezintă o zonă ocupată cu un obstacol. Pe linia n+2
se află 4
numere separate prin exact un spațiu, reprezentând is js ib jb
.
Date de ieşire
Fişierul de ieşire soarece.out
va conţine pe prima linie numărul S
, reprezentând numărul de modalități prin care șoarecele poate ajunge de la poziția inițială la cea a bucății de brânză.
Restricţii şi precizări
1 ≤ n,m ≤ 10
1 ≤ is,ib ≤ n
,1 ≤ js,jb ≤ m
- poziția șoarecelui și cea a bucății de brânză nu sunt identice și sunt libere
Exemplu
soarece.in
6 7 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 0 0 1 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 4 1 2 6
soarece.out
8
#include <bits/stdc++.h> using namespace std; ifstream cin("soarece.in"); ofstream cout("soarece.out"); int n , m , is , js , ib , jb , a[11][11] , cnt , b[11][11]; const int di[] = {0 , 0 , 1 , -1}; const int dj[] = {1 , -1 , 0 , 0}; int inside(int i , int j) { return i >= 1 && i <= n && j >= 1 && j <= m; } void back(int i , int j , int pas) { for(int d = 0 ; d < 4 ; d++) { int inou = i + di[d]; int jnou = j + dj[d]; if(inside(inou , jnou) && a[inou][jnou] == 0) { a[inou][jnou] = pas; if(inou == ib && jnou == jb) cnt++; 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]; cin >> is >> js >> ib >> jb; a[is][js] = 1; back(is, js, 2); cout << cnt; return 0; }