#include "cielib.h" #include <cstdio> #include <vector> using namespace std; typedef vector<int> vi; #define pb push_back #define FORI for(int i=0; i<d; ++i) int d, k, r; vi lastQ; bool lepiej(vi& a, vi& b) { FORI if(a[i] < 0 || a[i] > r || b[i] < 0 || b[i] > r) return false; if(a != lastQ) czyCieplo(&a[0]); lastQ = b; return czyCieplo(&b[0]); } bool inc(vi& t) { for(int i=0; i<d; ++i) if(t[i] == -1) t[i] = 2; bool res = false; for(int i=0; i<=d; ++i) { if(i==d) break; ++t[i]; if(t[i] <= 2) {res = true; break;} else t[i] = 0; } for(int i=0; i<d; ++i) if(t[i] == 2) t[i] = -1; return res; } void dbl(vi& t) { for(int i=0; i<d; ++i) t[i] *= 2; } vi plus(const vi& x, const vi& t) { vi p(d, 0); for(int i=0; i<d; ++i) p[i] = x[i] + t[i]; return p; } vi szukaj(vi x) { while(true) { // Az nie da sie poprawic bool poprawione = false; vi t(d, 0); while(inc(t)) { // Dla kazdego kierunku // printf("t = "); FORI printf("\t%d", t[i]); puts(""); vi gt = t; vi next = plus(x, gt); while(lepiej(x, next)) { // Dopoki kierunek dziala poprawione = true; x = next; //FORI printf("\t%d", x[i]); puts(""); dbl(gt); next = plus(x, gt); } if(poprawione) break; } if(!poprawione) return x; } } int main() { d = podajD(); k = podajK(); r = podajR(); vi wynik = szukaj(vi(d, 0)); znalazlem(&wynik[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 | #include "cielib.h" #include <cstdio> #include <vector> using namespace std; typedef vector<int> vi; #define pb push_back #define FORI for(int i=0; i<d; ++i) int d, k, r; vi lastQ; bool lepiej(vi& a, vi& b) { FORI if(a[i] < 0 || a[i] > r || b[i] < 0 || b[i] > r) return false; if(a != lastQ) czyCieplo(&a[0]); lastQ = b; return czyCieplo(&b[0]); } bool inc(vi& t) { for(int i=0; i<d; ++i) if(t[i] == -1) t[i] = 2; bool res = false; for(int i=0; i<=d; ++i) { if(i==d) break; ++t[i]; if(t[i] <= 2) {res = true; break;} else t[i] = 0; } for(int i=0; i<d; ++i) if(t[i] == 2) t[i] = -1; return res; } void dbl(vi& t) { for(int i=0; i<d; ++i) t[i] *= 2; } vi plus(const vi& x, const vi& t) { vi p(d, 0); for(int i=0; i<d; ++i) p[i] = x[i] + t[i]; return p; } vi szukaj(vi x) { while(true) { // Az nie da sie poprawic bool poprawione = false; vi t(d, 0); while(inc(t)) { // Dla kazdego kierunku // printf("t = "); FORI printf("\t%d", t[i]); puts(""); vi gt = t; vi next = plus(x, gt); while(lepiej(x, next)) { // Dopoki kierunek dziala poprawione = true; x = next; //FORI printf("\t%d", x[i]); puts(""); dbl(gt); next = plus(x, gt); } if(poprawione) break; } if(!poprawione) return x; } } int main() { d = podajD(); k = podajK(); r = podajR(); vi wynik = szukaj(vi(d, 0)); znalazlem(&wynik[0]); } |