#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
                    English