fbpx

Problema #3321 – Stone – Rezolvari PBInfo

de Mihai-Alexandru

Peste 3700 de ani lumea a devenit dreptunghiulară, este formată n x m zone și este stăpânită de un rege care are o armată formată din q soldați. În regat se află k turnuri de piatră, ostile armatei regelui, la coordonate cunoscute; fiecare turn atacă zonele de pe linia și coloana sa.

Cerința

Regele dorește să afle în câte moduri poate plasa soldații în zonele fără turnuri ale regatului astfel încât aceștia să nu fie atacați de turnuri.

Date de intrare

Programul citește de la tastatură dimensiunile n și m ale regatului, numărul de turnuri k și numărul de soldați q. Pe următoarele k linii se află câte două valori, reprezentând coordonatele turnurilor.

Date de ieșire

Programul va afișa pe ecran numărul p, reprezentând numărul de moduri în care pot fi plasați soldații regelui.

Restricții și precizări

  • 1 ≤ n , m ≤ 4
  • 1 ≤ q , k ≤ n*m
  • în cazul în care nu există niciun mod de plasare a soldaților se va afișa 0
  • soldații sunt diferiți între ei; două moduri de plasare a soldaților pot să folosească aceleași zone, dar să fie diferite prin ordinea în care sunt plasați soldații în aceste zone.

Exemplu 1:

Intrare

3 3 1 1
2 2

Ieșire

4

Explicație

Zonele neatacate de turnuri au coordonatele (1,1), (1,3), (3,1), (3,3).

Exemplu 2:

Intrare

4 4 1 9
1 1

Ieșire

362880

Precizare

Acesta este cel mai mare test.

Exemplu 3:

Intrare

3 3 3 4
1 1
2 2
3 3

Ieșire

0

Explicație

Nu au rămas destule zone neatacate de turnuri.

#include <bits/stdc++.h>
using namespace std;

int n, m, k, p, a[10][10];

int fact(int n){
    if(n == 0)
        return 1;
    else
        return n * fact(n-1);
}

int main(){
    cin >> n >> m >> k >> p;
    int x, y;
    for(int i = 1; i <= k; ++i){
        cin >> x >> y;
        for(int j = 1; j <= m; ++j)
            a[x][j] = 1;
        for(int j = 1; j <= n; ++j)
            a[j][y] = 1;
    }
    int cnt = 0;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j)
            if(a[i][j] == 0)
                cnt++;
    if(cnt < p)
        cout << 0;
    else{
        cout << fact(cnt) / fact(cnt - p);
    }
}
Comentarii

S-ar putea sa iti placa