#include "cielib.h" int d,k,r; int M; //r = M = 2^N int A[501], B[501]; int ODP[501]; //tu sie miesci info, ktora "cwiartke" wybrac do nastepnego kroku void wez_dane(void) { int w=1; d=podajD(); k=podajK(); r=podajR(); while(w<r) w=2*w; M=w; return; } void krok1(void) { int aa[d], bb[d]; int i; for(i=0;i<d;++i) { aa[i]=(A[i]+B[i])/2; bb[i]=aa[i]; ODP[i]=0; } for(i=0;i<d;++i) { aa[i]=A[i]; bb[i]=B[i]; ODP[i]=czyCieplo(aa); ODP[i]=czyCieplo(bb); aa[i]=(A[i]+B[i])/2; bb[i]=aa[i]; } return; } void krok_ost(void) { int aa[d], bb[d]; int i; for(i=0;i<d;++i) { aa[i]=(A[i]+B[i])/2; bb[i]=aa[i]; ODP[i]=0; } for(i=0;i<d;++i) { aa[i]=A[i]; bb[i]=B[i]; ODP[i]=czyCieplo(aa); ODP[i]=czyCieplo(bb); if(ODP[i]==0 && (czyCieplo(aa)==0)) ODP[i]=2; //0: w A jest lepiej niz w B, 2: w A tak jak w B aa[i]=(A[i]+B[i])/2; bb[i]=aa[i]; } return; } int main() { wez_dane(); int i,w; //poczatkowy szescian: A=(0,0,0,...,0), B=(M,M,M,...,M) for(i=0;i<d;++i) { A[i]=0; B[i]=M; } w=M; //na podstawie ODP wybieramy odpowiedni pod-szescian while(w>2) { krok1(); for(i=0;i<d;++i) { if(ODP[i]==0) {A[i]=A[i]; B[i]=(A[i]+B[i])/2;} if(ODP[i]==1) {B[i]=B[i]; A[i]=(A[i]+B[i])/2;} } w/=2; } //ostatni krok krok_ost(); for(i=0;i<d;++i) { if(ODP[i]==0) {A[i]=A[i]; B[i]=A[i];} if(ODP[i]==1) {B[i]=B[i]; A[i]=B[i];} if(ODP[i]==2) {B[i]=(A[i]+B[i])/2; A[i]=B[i];} } znalazlem(B); 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 | #include "cielib.h" int d,k,r; int M; //r = M = 2^N int A[501], B[501]; int ODP[501]; //tu sie miesci info, ktora "cwiartke" wybrac do nastepnego kroku void wez_dane(void) { int w=1; d=podajD(); k=podajK(); r=podajR(); while(w<r) w=2*w; M=w; return; } void krok1(void) { int aa[d], bb[d]; int i; for(i=0;i<d;++i) { aa[i]=(A[i]+B[i])/2; bb[i]=aa[i]; ODP[i]=0; } for(i=0;i<d;++i) { aa[i]=A[i]; bb[i]=B[i]; ODP[i]=czyCieplo(aa); ODP[i]=czyCieplo(bb); aa[i]=(A[i]+B[i])/2; bb[i]=aa[i]; } return; } void krok_ost(void) { int aa[d], bb[d]; int i; for(i=0;i<d;++i) { aa[i]=(A[i]+B[i])/2; bb[i]=aa[i]; ODP[i]=0; } for(i=0;i<d;++i) { aa[i]=A[i]; bb[i]=B[i]; ODP[i]=czyCieplo(aa); ODP[i]=czyCieplo(bb); if(ODP[i]==0 && (czyCieplo(aa)==0)) ODP[i]=2; //0: w A jest lepiej niz w B, 2: w A tak jak w B aa[i]=(A[i]+B[i])/2; bb[i]=aa[i]; } return; } int main() { wez_dane(); int i,w; //poczatkowy szescian: A=(0,0,0,...,0), B=(M,M,M,...,M) for(i=0;i<d;++i) { A[i]=0; B[i]=M; } w=M; //na podstawie ODP wybieramy odpowiedni pod-szescian while(w>2) { krok1(); for(i=0;i<d;++i) { if(ODP[i]==0) {A[i]=A[i]; B[i]=(A[i]+B[i])/2;} if(ODP[i]==1) {B[i]=B[i]; A[i]=(A[i]+B[i])/2;} } w/=2; } //ostatni krok krok_ost(); for(i=0;i<d;++i) { if(ODP[i]==0) {A[i]=A[i]; B[i]=A[i];} if(ODP[i]==1) {B[i]=B[i]; A[i]=B[i];} if(ODP[i]==2) {B[i]=(A[i]+B[i])/2; A[i]=B[i];} } znalazlem(B); return 0; } |