#include <iostream>
#include <iomanip>
using namespace std;

int positionValue(int pos);
void printTree(int pos, int level);
int valueMoveComputer(int pos);
int valueMoveHuman(int pos);

int positionValue(int pos) {
    static const int value[16]={4,5,3,2,6,7,8,9,1,10,2,11,12,13,14,14};
    if (pos>=15 && pos<31)
        return value[pos-15];
    return -1;
}

void printTree(int pos, int level) {
    if (level!=5) {
        printTree(2*pos+2, level+1);
        cout<<setw(level*5)<<pos<<":"<<positionValue(pos)<<endl;
        if (pos==0)
                cin.get();
        printTree(2*pos+1, level+1);
    }
}

int valueMoveComputer(int pos) {
   	int value(positionValue(pos));
	if (value==-1) {
        value=0;
        for (int i(1); i<3; ++i) {
    	    int reply(valueMoveHuman(2*pos+i));
    	    if (reply>value) {
                value=reply;
    	    }
	    }
    }
	return value;
}

int valueMoveHuman(int pos) {
   	int value(positionValue(pos));
	if (value==-1) {
	    value=15;
    	for (int i(1); i<3; ++i) {
            int reply(valueMoveComputer(2*pos+i));
    	    if (reply<value) {
    		    value=reply;
    	    }
        } 
	}
	return value;
}

// alles in 1 routine (is minder duidelijk en ook minder snel!
enum Side {HUMAN, COMPUTER};

int valueMove(Side s, int pos) {
   	int value(positionValue(pos));
	if (value==-1) {
        value=(s==COMPUTER)?0:15;
        for (int i(1); i<3; ++i) {
    	    int reply(valueMove((s==COMPUTER)?HUMAN:COMPUTER, 2*pos+i));
    	    if (s==COMPUTER&&reply>value || s==HUMAN&&reply<value) {
                value=reply;
    	    }
	    }
    }
	return value;
}

int main() {
    printTree(0, 0);
    cin.get();    
    cout<<"Pos:  0"<<" Value: "<<setw(2)<<valueMoveComputer(0)<<endl;
    for (int p(1); p<3; ++p) 
        cout<<"Pos: "<<setw(2)<<p<<" Value: "<<setw(2)<<valueMoveHuman(p)<<endl;
    for (int p(3); p<7; ++p) 
        cout<<"Pos: "<<setw(2)<<p<<" Value: "<<setw(2)<<valueMoveComputer(p)<<endl;
    for (int p(7); p<15; ++p) 
        cout<<"Pos: "<<setw(2)<<p<<" Value: "<<setw(2)<<valueMoveHuman(p)<<endl;
    cin.get();
    cout<<"Pos:  0"<<" Value: "<<setw(2)<<valueMove(COMPUTER, 0)<<endl;
    cin.get();
}

