#include "cielib.h" #include <iostream> void odwroc(int* proba1, int* proba2, int* begin, int* end, int d) { for(int i = 0; i < d; i++) { proba2[i] = (proba1[i] == begin[i]) ? end[i] : begin[i]; } } bool czyKoniec(int* begin, int* end, int d) { for(int i = 0; i < d; i++) { if(begin[i] != end[i]) return false; } return true; } void kopiuj(int* from, int* to, int d) { for(int i = 0; i < d; i++) { to[i] = from[i]; } } void odwrocParzyste(int* from1, int* from2, int* to, int d, bool parzyste) { for(int i = 0; i < d; i++) { to[i] = ((i % 2) == parzyste) ? from1[i] : from2[i]; } } void podzielNaPol(int* begin, int* end, int d, bool zDolu, bool parzyste) { for(int i = 0; i < d; i++) { if(parzyste && (i % 2 == 1) ) continue; if(!parzyste && (i % 2 == 0) ) continue; if(zDolu) begin[i] = (begin[i] + end[i] + 1)/2; else end[i] = (begin[i] + end[i])/2; } } void wypisz(int* in, int d) { for(int i = 0; i < d; i++) std::cout << in[i] << ", "; std::cout << "\n"; } int main() { int r = podajR(); int d = podajD(); // int begin[2]; // int end[2]; // int proba1[2]; // int proba2[2]; // int proba3[2]; // int proba4[2]; int begin[d]; int end[d]; int proba1[d]; int proba2[d]; int proba3[d]; int proba4[d]; for(int i = 0; i < d; i++) { begin[i] = 0; end[i] = r; } bool cieplo1; bool cieplo2; bool parzyste = false; while(czyKoniec(begin, end, d) == false) { // wypisz(begin, d); // wypisz(end, d); parzyste = !parzyste; kopiuj(begin, proba1, d); czyCieplo(proba1); odwroc(proba1, proba2, begin, end, d); cieplo1 = czyCieplo(proba2); if(d == 1) { int diff = end[0] - begin[0]; if(cieplo1) begin[0] = (begin[0] + end[0] + 1)/2; else end[0] = (begin[0] + end[0])/2; continue; } odwrocParzyste(begin, end, proba3, d, parzyste); czyCieplo(proba3); odwroc(proba3, proba4, begin, end, d); cieplo2 = czyCieplo(proba4); // jezeli cieplo1 to zdejmujemy z gory, jezeli bool cos = ((cieplo1 && cieplo2) || (!cieplo1 && !cieplo2)) xor parzyste; podzielNaPol(begin, end, d, cieplo1, cos); } znalazlem(begin); }
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 | #include "cielib.h" #include <iostream> void odwroc(int* proba1, int* proba2, int* begin, int* end, int d) { for(int i = 0; i < d; i++) { proba2[i] = (proba1[i] == begin[i]) ? end[i] : begin[i]; } } bool czyKoniec(int* begin, int* end, int d) { for(int i = 0; i < d; i++) { if(begin[i] != end[i]) return false; } return true; } void kopiuj(int* from, int* to, int d) { for(int i = 0; i < d; i++) { to[i] = from[i]; } } void odwrocParzyste(int* from1, int* from2, int* to, int d, bool parzyste) { for(int i = 0; i < d; i++) { to[i] = ((i % 2) == parzyste) ? from1[i] : from2[i]; } } void podzielNaPol(int* begin, int* end, int d, bool zDolu, bool parzyste) { for(int i = 0; i < d; i++) { if(parzyste && (i % 2 == 1) ) continue; if(!parzyste && (i % 2 == 0) ) continue; if(zDolu) begin[i] = (begin[i] + end[i] + 1)/2; else end[i] = (begin[i] + end[i])/2; } } void wypisz(int* in, int d) { for(int i = 0; i < d; i++) std::cout << in[i] << ", "; std::cout << "\n"; } int main() { int r = podajR(); int d = podajD(); // int begin[2]; // int end[2]; // int proba1[2]; // int proba2[2]; // int proba3[2]; // int proba4[2]; int begin[d]; int end[d]; int proba1[d]; int proba2[d]; int proba3[d]; int proba4[d]; for(int i = 0; i < d; i++) { begin[i] = 0; end[i] = r; } bool cieplo1; bool cieplo2; bool parzyste = false; while(czyKoniec(begin, end, d) == false) { // wypisz(begin, d); // wypisz(end, d); parzyste = !parzyste; kopiuj(begin, proba1, d); czyCieplo(proba1); odwroc(proba1, proba2, begin, end, d); cieplo1 = czyCieplo(proba2); if(d == 1) { int diff = end[0] - begin[0]; if(cieplo1) begin[0] = (begin[0] + end[0] + 1)/2; else end[0] = (begin[0] + end[0])/2; continue; } odwrocParzyste(begin, end, proba3, d, parzyste); czyCieplo(proba3); odwroc(proba3, proba4, begin, end, d); cieplo2 = czyCieplo(proba4); // jezeli cieplo1 to zdejmujemy z gory, jezeli bool cos = ((cieplo1 && cieplo2) || (!cieplo1 && !cieplo2)) xor parzyste; podzielNaPol(begin, end, d, cieplo1, cos); } znalazlem(begin); } |