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
#include "dzialka.h"
#include "message.h"

#include <iostream>

int main() {
    const int myNodeId = MyNodeId();
    const int numberOfNodes = NumberOfNodes();

    const int NumRows = GetFieldHeight();
    const int NumCols = GetFieldWidth();

    const unsigned long long ArraySize = NumCols * NumRows;

    long long Result = 0;

    unsigned long long CellNumber = 0;
    unsigned int k = 0;

    int StartRowNumber = 0;
    int StartColNumber = 0;

    int MaxColInPreviousRow = -1;

    bool ShouldFinishRow = false;

    while (true) {
        CellNumber = myNodeId + k * numberOfNodes;
        ++k;

        if (CellNumber >= ArraySize) {
            break;
        }

        StartRowNumber = CellNumber / NumCols;
        StartColNumber = CellNumber % NumCols;
        if (StartRowNumber >= NumRows) {
            break;
        }

        // Do the work here

        MaxColInPreviousRow = NumCols;
        ShouldFinishRow = false;

        for (int Row = StartRowNumber; Row < NumRows; ++Row) {
            for (int Col = StartColNumber; Col < MaxColInPreviousRow; ++Col) {
                if (IsUsableCell(Row, Col)) {
                    ++Result;
                } else {
                    MaxColInPreviousRow = Col;
                    if (Col == StartColNumber) {
                        ShouldFinishRow = true;
                    }
                    break;
                }
            }
            if (ShouldFinishRow) {
                break;
            }
        }

    }

    if (myNodeId > 0) {
        PutLL(0, Result);
        Send(0);
        return 0;
    }

    for (int NodeNumber = 1; NodeNumber < numberOfNodes; ++ NodeNumber) {
        Receive(NodeNumber);
        Result += GetLL(NodeNumber);
    }

    std::cout << Result << "\n";

    return 0;
}