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