1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//  dzi.cpp
//
//  Autor: Jakub Chmist
//  Utworzony 24.11.2017

#include "message.h"
#include "dzialka.h"
#include <iostream>
//#include <algorithm>
//#include <array>
//#include <cmath>
//#include <iomanip>

using namespace std;


int m; // ilość wierszy
int n; // ilość kolumn

long long suma_przyd = 0; // suma przydatnosci dla wszystkich podmacierzy

int main() {

    m = GetFieldHeight();
    n = GetFieldWidth();

    int **t_A = new int *[m];
    for ( int i = 0; i < m; ++i ){
        t_A[i] = new int [n];
        for ( int j = 0; j < n; ++j){
            t_A[i][j] = IsUsableCell(i, j);
        }
    }

    int t_wiersze;  // do sprawdzania pola "1" w kolejnych wierszach
    int t_kolumny;  // do sprawdzania pola "1" w kolejnych kolumnach

for (int wp = 1 + MyNodeId(); wp <= m; wp += NumberOfNodes()){
  for (int kp = 1; kp <= n; kp++){
    t_wiersze = 0;
    t_kolumny = 0;
    for (int e = 0; e < wp; e++){
        for (int f = 0; f < kp; f++){
            t_wiersze += t_A[e][f];
        }
    }

//dane po pierwzsej podmacierzy (bazowej)
    if (t_wiersze == wp * kp){
        suma_przyd++;
    }

//dla kolejnych wierszy
    for (int i = 0; i < m - wp + 1; i++) {
//cout <<"i: " << i << endl;
//jezeli wiersz > 0 to zwieksz wiersz (zmniejsz przydatnosc bazowa dla usuwanego wiersza i zwieksz dla dodawanego wiersza)
//        t_kolumny = t_wiersze;
        if (i > 0){
            for (int f = 0; f < kp; f++){
//dla wiersza wycofywanego podmacierzy
                if (t_A[i-1][f] == 1) {
                      t_wiersze--;
                }
//dla nowego wiersza podmacierzy
                if (t_A[i+wp-1][f] == 1) {
                      t_wiersze++;
                }
            }
            if (t_wiersze == wp * kp){
                suma_przyd++;
            }
        }

//cout << "W: " << suma_przyd << "\n";

        for (int j = 1; j < n - kp + 1; j++){
//cout << "j: " << i << endl;

//jezeli kolumna > 0 to zwieksz kolumne (zmiejsza rozrodnosc dla usuwanej kolumny i zwieksza dla dodawanej kolumny)

//pzepisuje do tablicy używanej dla kolejnych kolumn
            if (j==1) {
                t_kolumny = t_wiersze;
            }

            for (int e = i; e < i + wp; e++){
                if (t_A[e][j-1] == 1) {
                      t_kolumny--;
                }
                if (t_A[e][j+kp-1] == 1) {
                      t_kolumny++;
                }
            }
            if (t_kolumny == wp * kp){
                suma_przyd++;
            }
//cout << "K: " << suma_przyd << "\n";
        }
    }
  }
}

//wyswietlenie wynikow
  if (MyNodeId() > 0) {
    PutInt(0, suma_przyd);
    Send(0);
  } else {
    for (int instancja = 1; instancja < NumberOfNodes(); ++instancja) {
      Receive(instancja);
      suma_przyd += GetInt(instancja);
    }
    cout << suma_przyd << "\n";
  }

//niszczenie tablic dynamicznych
for ( int i(0); i < m; ++i )
{
    delete [] t_A[i];
}
delete [] t_A; //
t_A = NULL;

}