Переполнение стека при переборе вариантов

Рейтинг: 0Ответов: 0Опубликовано: 11.07.2023

Есть три игрока: A,B,C. У каждого из них есть число. Они ходят по очереди, за ход игрок может вычесть из числа другого игрока 1. Когда у одного из игроков число становиться равным 0, он получает 0 баллов за игру, а другие игроки: Если у одного из двух ост. число больше, чем у другого, он получает 2 балла, у другого-1 балл. При равном количестве они получают по 2 очка. Код должен найти, как следует играть, чтобы получить
максимальное количество баллов.

function bestGame(a,b,c){
    function winner(a,b,c){
        if(a==0){
            if(b>c){
                return [0,2,1];
            }
            else if(b<c){
                return [0,1,2];
            }
            else{
                return [0,3,3];
            }
        }
        if(b==0){
            if(a>c){
                return [2,0,1];
            }
            else if(c<a){
                return [1,0,2];
            }
            else{
                return [3,0,3];
            }
        }
        if(c==0){
            if(a>b){
                return [2,1,0];
            }
            else if(b<a){
                return [1,2,0];
            }
            else{
                return [3,3,0];
            }
        }
    }
    function best_gameA(a,b,c,h){//Стратегия A.
        if(a*b*c==0){
            return [winner(a,b,c),h];
        }
        var b1=[-1,-1,-1];//Количество баллов у трёх игроков.
        var h1="";//История игры
        var b=best_gameB(a,b-1,c,h+[a,b-1,c]);
        if(b[0][0]>b1){
            b1=b[0];
            h1=h+[a,b-1,c];
        }
        b=best_gameB(a,b,c-1,h+[a,b,c-1]);
        if(b[0][0]>b1){
            b1=b[0];
            h=b[1]+[a,b,c-1];
        }
        return [b1,h];
    }
    function best_gameB(a,b,c,h){//Стратегия B
        if(a*b*c==0){
            return [winner(a,b,c),h];
        }
        var b1=[-1,-1,-1];
        var h1="";
        var b=best_gameC(a-1,b,c,h+[a-1,b,c]);
        if(b[0][1]>b1){
            b1=b[0];
            h1=h+[a-1,b,c];
        }
        b=best_gameC(a,b,c-1,h+[a,b,c-1]);
        if(b[0][1]>b1){
            b1=b[0];
            h=b[1]+[a,b,c-1];
        }
        return [b1,h];
    }
    function best_gameC(a,b,c,h){//Стратегия C
        if(a*b*c==0){
            return [winner(a,b,c),h];
        }
        var b1=[-1,-1,-1];
        var h1="";
        var b=best_gameA(a-1,b,c,h+[a-1,b,c]);
        if(b[0][2]>b1){
            b1=b[0];
            h1=h+[a-1,b,c];
        }
        b=best_gameA(a,b-1,c,h+[a,b-1,c]);
        if(b[0][2]>b1){
            b1=b[0];
            h=b[1]+[a,b,c-1];
        }
        return [b1,h];
    }
    return best_gameA(a,b,c,"");
}
alert(bestGame(2,3,4));

Проблема в том, что стек переполняется.

Ответы

Ответов пока нет.