/*
Krzysztof Dziembała
*/
#include <iostream>
#include "message.h"
#include "krazki.h"
int main(){
int cnode = MyNodeId();
int height = PipeHeight();
int discsNum = NumberOfDiscs();
if(discsNum > height){ //if there are more discs than max height write 0 and exit
if(cnode == 0){
std::cout << "0\n";
}
return 0;
}
if(cnode >= discsNum) return 0; //exit if there are more nodes than discs
int non = NumberOfNodes();
int startLP = (cnode * discsNum) / non; //start disc for current node
int endLP = ((cnode + 1) * discsNum) / non; //first disc for next node
int discPos = 0; //how far last disc checked by this node can go
for(int i = startLP; i < endLP; i++){
long long int currDiscDiam = DiscDiameter(i+1);
for(int a = 1; a <= height; a++){
if(a < discPos){
if(currDiscDiam >= HoleDiameter(a)){
discPos = a; //discPos++ would be good too
} else {
break;
}
} else {
break;
}
}
}
int finalPos = discPos; //needed only for node 0 (but not a problem for others)
if(cnode != 0){ //send result and number of checked discs to node number 0
PutInt(0, discPos);
PutInt(0, (endLP - startLP));
Send(0);
} else { //receive results on node 0
for (int i = 1; i < NumberOfNodes(); ++i) {
int fromNode = Receive(i);
int recPos = GetInt(fromNode);
int checked = GetInt(fromNode);
if(recPos <= (finalPos - checked)){
finalPos = recPos;
} else {
finalPos -= checked;
}
}
if(finalPos < 0)
finalPos = 0;
std::cout << finalPos << '\n';
}
return 0;
}
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 | /* Krzysztof Dziembała */ #include <iostream> #include "message.h" #include "krazki.h" int main(){ int cnode = MyNodeId(); int height = PipeHeight(); int discsNum = NumberOfDiscs(); if(discsNum > height){ //if there are more discs than max height write 0 and exit if(cnode == 0){ std::cout << "0\n"; } return 0; } if(cnode >= discsNum) return 0; //exit if there are more nodes than discs int non = NumberOfNodes(); int startLP = (cnode * discsNum) / non; //start disc for current node int endLP = ((cnode + 1) * discsNum) / non; //first disc for next node int discPos = 0; //how far last disc checked by this node can go for(int i = startLP; i < endLP; i++){ long long int currDiscDiam = DiscDiameter(i+1); for(int a = 1; a <= height; a++){ if(a < discPos){ if(currDiscDiam >= HoleDiameter(a)){ discPos = a; //discPos++ would be good too } else { break; } } else { break; } } } int finalPos = discPos; //needed only for node 0 (but not a problem for others) if(cnode != 0){ //send result and number of checked discs to node number 0 PutInt(0, discPos); PutInt(0, (endLP - startLP)); Send(0); } else { //receive results on node 0 for (int i = 1; i < NumberOfNodes(); ++i) { int fromNode = Receive(i); int recPos = GetInt(fromNode); int checked = GetInt(fromNode); if(recPos <= (finalPos - checked)){ finalPos = recPos; } else { finalPos -= checked; } } if(finalPos < 0) finalPos = 0; std::cout << finalPos << '\n'; } return 0; } |
English