#include "cielib.h" #include <iostream> using namespace std; class Poszukiwacz { public: Poszukiwacz() { D = podajD(); R = podajR(); uklad = new int[D]; } ~Poszukiwacz() { delete [] uklad; } int nonnegative(int a) { if (a < 0) return 0; else return a; } int srodek(int b, int e) { return (b+e)/2; } void zawez(int d) { const int u = uklad[d]; uklad[d] += M; czyCieplo(uklad); uklad[d] = nonnegative(u - M); int cieplo = czyCieplo(uklad); if (cieplo == 1) { if (u - M < 0) uklad[d] = srodek(0, M); else uklad[d] = srodek(u-M, u); } else { // zimno, czyli szukamy na gorze uklad[d] = srodek(u, u + M); } } void handleEdgeCondition(int d) { const int u = uklad[d]; if (u > 0 && u < R) { uklad[d] = u + 1; czyCieplo(uklad); uklad[d] = u - 1; int cieplo = czyCieplo(uklad); if (cieplo != 1) {// zimno, Krotka jest na gorze lub w srodku uklad[d] = u + 1; int c2 = czyCieplo(uklad); if (c2 != 1) { //zimno, krecimy sie wokol u i ciagle jest zimno uklad[d] = u; } // else do nothing, Krotka jest znaleziona na gorze } // else do nothing, Krotka jest znaleziona na dole } if (u == 0) { uklad[d] = 2; czyCieplo(uklad); uklad[d] = 0; int cieplo = czyCieplo(uklad); if (cieplo != 1) uklad[d] = 1; } if (u == R) { uklad[d] = R-2; czyCieplo(uklad); uklad[d] = R; int cieplo = czyCieplo(uklad); if (cieplo != 1) uklad[d] = R -1; } } void szukaj() { for (int d = 0; d < D; ++d) uklad[d] = R/2; M = R - R/2; while (M > 1) { //wyswietlStan(); for (int d = 0; d < D; ++d) zawez(d); M = (M+1)/2; } //wyswietlStan(); //cerr << "\n-------- OGARNIANIE BRZEGU -------\n" << endl; for (int d = 0; d < D; ++d) handleEdgeCondition(d); znalazlem(uklad); } void wyswietlStan() { cerr << "("; for (int i = 0; i < D-1; ++i) cerr << uklad[i] << ", "; cerr << uklad[D-1] << ") M=" << M << endl; } private: int* uklad; int M; // ograniczenie na maksymalny blad int D; int R; }; int main() { Poszukiwacz p; p.szukaj(); 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 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 | #include "cielib.h" #include <iostream> using namespace std; class Poszukiwacz { public: Poszukiwacz() { D = podajD(); R = podajR(); uklad = new int[D]; } ~Poszukiwacz() { delete [] uklad; } int nonnegative(int a) { if (a < 0) return 0; else return a; } int srodek(int b, int e) { return (b+e)/2; } void zawez(int d) { const int u = uklad[d]; uklad[d] += M; czyCieplo(uklad); uklad[d] = nonnegative(u - M); int cieplo = czyCieplo(uklad); if (cieplo == 1) { if (u - M < 0) uklad[d] = srodek(0, M); else uklad[d] = srodek(u-M, u); } else { // zimno, czyli szukamy na gorze uklad[d] = srodek(u, u + M); } } void handleEdgeCondition(int d) { const int u = uklad[d]; if (u > 0 && u < R) { uklad[d] = u + 1; czyCieplo(uklad); uklad[d] = u - 1; int cieplo = czyCieplo(uklad); if (cieplo != 1) {// zimno, Krotka jest na gorze lub w srodku uklad[d] = u + 1; int c2 = czyCieplo(uklad); if (c2 != 1) { //zimno, krecimy sie wokol u i ciagle jest zimno uklad[d] = u; } // else do nothing, Krotka jest znaleziona na gorze } // else do nothing, Krotka jest znaleziona na dole } if (u == 0) { uklad[d] = 2; czyCieplo(uklad); uklad[d] = 0; int cieplo = czyCieplo(uklad); if (cieplo != 1) uklad[d] = 1; } if (u == R) { uklad[d] = R-2; czyCieplo(uklad); uklad[d] = R; int cieplo = czyCieplo(uklad); if (cieplo != 1) uklad[d] = R -1; } } void szukaj() { for (int d = 0; d < D; ++d) uklad[d] = R/2; M = R - R/2; while (M > 1) { //wyswietlStan(); for (int d = 0; d < D; ++d) zawez(d); M = (M+1)/2; } //wyswietlStan(); //cerr << "\n-------- OGARNIANIE BRZEGU -------\n" << endl; for (int d = 0; d < D; ++d) handleEdgeCondition(d); znalazlem(uklad); } void wyswietlStan() { cerr << "("; for (int i = 0; i < D-1; ++i) cerr << uklad[i] << ", "; cerr << uklad[D-1] << ") M=" << M << endl; } private: int* uklad; int M; // ograniczenie na maksymalny blad int D; int R; }; int main() { Poszukiwacz p; p.szukaj(); return 0; } |