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