#include "cielib.h" #include <vector> #include <stdio.h> int* poz; int* max; inline void idz_dalej(int dim) { //printf("poz[%i]=%i max[%i]=%i => ", dim, poz[dim], dim, max[dim]); int s = max[dim]+poz[dim]; poz[dim] = s/2 + (s%2!=0); //ceiling //printf("poz[%i]=%i max[%i]=%i\n", dim, poz[dim], dim, max[dim]); } inline void idz_blizej(int dim) { //printf("poz[%i]=%i max[%i]=%i => ", dim, poz[dim], dim, max[dim]); max[dim] = (max[dim]+poz[dim])/2; //printf("poz[%i]=%i max[%i]=%i\n", dim, poz[dim], dim, max[dim]); } inline int width(int dim) { //printf("poz[%i]=%i max[%i]=%i\n", dim, poz[dim], dim, max[dim]); return max[dim]-poz[dim] ; } int main() { int d = podajD(); int r = podajR(); poz = new int[d]; max = new int[d]; std::vector<int> cale; std::vector<int> polowki; for (int i=0; i<d; ++i) { poz[i] = 0; max[i] = r; cale.push_back(i); } while (width(0)>0) { //printf("width(0)=%i\n", width(0)); while (cale.size()>0) { int wszystkie = cale.size(); std::vector<int> bez_zmiany; while (cale.size()>0) { //printf("cale.size()=%i\n", cale.size()); int dim = cale.back(); cale.pop_back(); czyCieplo(poz); int prev_poz = poz[dim]; poz[dim] = max[dim]; int cieplej_dalej = czyCieplo(poz); poz[dim] = prev_poz; if (cieplej_dalej>0) { polowki.push_back(dim); idz_dalej(dim); } else { int cieplej_blizej = czyCieplo(poz); if (cieplej_blizej>0) { polowki.push_back(dim); idz_blizej(dim); } else { bez_zmiany.push_back(dim); } } }//while //printf("bez_zmiany.size()=%i wszystkie=%i\n", bez_zmiany.size(), wszystkie); if (bez_zmiany.size()==wszystkie) { while (bez_zmiany.size()>0) { int dim = bez_zmiany.back(); bez_zmiany.pop_back(); polowki.push_back(dim); idz_dalej(dim); } } //if cale = std::move(bez_zmiany); bez_zmiany.clear(); } //while cale.size()>0 //printf("changing bounds to %i\n", width(0)); cale = std::move(polowki); polowki.clear(); } //for (int i=0; i<d; ++i) printf("poz[%i]=%i\n", i, poz[i]); znalazlem(poz); }
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 | #include "cielib.h" #include <vector> #include <stdio.h> int* poz; int* max; inline void idz_dalej(int dim) { //printf("poz[%i]=%i max[%i]=%i => ", dim, poz[dim], dim, max[dim]); int s = max[dim]+poz[dim]; poz[dim] = s/2 + (s%2!=0); //ceiling //printf("poz[%i]=%i max[%i]=%i\n", dim, poz[dim], dim, max[dim]); } inline void idz_blizej(int dim) { //printf("poz[%i]=%i max[%i]=%i => ", dim, poz[dim], dim, max[dim]); max[dim] = (max[dim]+poz[dim])/2; //printf("poz[%i]=%i max[%i]=%i\n", dim, poz[dim], dim, max[dim]); } inline int width(int dim) { //printf("poz[%i]=%i max[%i]=%i\n", dim, poz[dim], dim, max[dim]); return max[dim]-poz[dim] ; } int main() { int d = podajD(); int r = podajR(); poz = new int[d]; max = new int[d]; std::vector<int> cale; std::vector<int> polowki; for (int i=0; i<d; ++i) { poz[i] = 0; max[i] = r; cale.push_back(i); } while (width(0)>0) { //printf("width(0)=%i\n", width(0)); while (cale.size()>0) { int wszystkie = cale.size(); std::vector<int> bez_zmiany; while (cale.size()>0) { //printf("cale.size()=%i\n", cale.size()); int dim = cale.back(); cale.pop_back(); czyCieplo(poz); int prev_poz = poz[dim]; poz[dim] = max[dim]; int cieplej_dalej = czyCieplo(poz); poz[dim] = prev_poz; if (cieplej_dalej>0) { polowki.push_back(dim); idz_dalej(dim); } else { int cieplej_blizej = czyCieplo(poz); if (cieplej_blizej>0) { polowki.push_back(dim); idz_blizej(dim); } else { bez_zmiany.push_back(dim); } } }//while //printf("bez_zmiany.size()=%i wszystkie=%i\n", bez_zmiany.size(), wszystkie); if (bez_zmiany.size()==wszystkie) { while (bez_zmiany.size()>0) { int dim = bez_zmiany.back(); bez_zmiany.pop_back(); polowki.push_back(dim); idz_dalej(dim); } } //if cale = std::move(bez_zmiany); bez_zmiany.clear(); } //while cale.size()>0 //printf("changing bounds to %i\n", width(0)); cale = std::move(polowki); polowki.clear(); } //for (int i=0; i<d; ++i) printf("poz[%i]=%i\n", i, poz[i]); znalazlem(poz); } |