#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); } |
English