为每个列表分配一个不在该列表中的数字

时间:2018-08-02 13:41:03

标签: php

我的标题措辞可能更好。我将从一个普遍的问题开始,解释大局,然后得出确切的问题。

我有一个网络应用程序来举办比赛,我认为很酷的功能之一就是还可以分配参赛者的赛道(因此,不仅可以进行计算并提供用户界面,还可以确定玩家应该在哪个赛道上进行比赛(如果您想想象一条赛道,请想象一下像保龄球馆的小巷)。问题是,如果玩家在上一个游戏或之前的游戏中玩过相同的曲目,则他不能在同一曲目上玩(但如果在下一行,则可以玩)。

当参赛者互相竞争时,我的第一个(也是迄今为止唯一的想法)是遍历每对玩家,检查他们播放的曲目并将其添加到名为playedTracks的数组中。

让我们说这个功能已经完成,并且正确地返回了一个数组playedTracks,最大大小为4(四是两个玩家都玩了至少三轮,而两个都没有玩过)与其他曲目相同):

function getPlayedTracks($resultId,$opponentResultId,$currentRound){
    //Returns the list of tracks on which the pair has played on!
    $playedTracks = [];
    if ($currentRound == 1){
        //No tracks to pick from
        return [];
    }
    else if ($currentRound == 2){
        //One track to pick from
        $oneBehind = 1;
    }
    else{
        //Pick from two tracks
        $oneBehind = $currentRound - 1;
        $twoBehind = $currentRound - 2;
    }
    return $playedTracks,
}

现在,我正坐在一个循环中(正如我提到的那样,我要遍历一对球员),我有一对球员和他们在其中进行比赛的赛道。我还有一组要分配的曲目,假设我有编号为1,2,3,4,5且返回$playedTracks的{​​{1}}的曲目。因此,选择是[1,2,3]。我将选择4 or 5。随着循环向前循环,将返回更多4,并且在某些时候可能存在分配曲目的情况,但是在过去的两场比赛中,它们都已经在该曲目上播放了。

我不确定我的方法是否正确,也许我应该考虑逐个玩家而不是一对。有没有人遇到过类似的问题,或者可以在此问题上说出什么有帮助的话?

出于好奇,这是循环部分(是的,我不赞成使用mysql扩展名):

$playedTracks

1 个答案:

答案 0 :(得分:0)

下次其他人遇到麻烦时,只需发布​​答案即可。

曲目列表$listOfTracks = [1,2,3,4,5]。这些都是曲目。

每对可用的轨道可以添加到一个数组中(索引指的是对):

$availableTracks = [[1,4],[3,5],[2,3,5],[1,2],[2,4]]

此数组可以可视化为树。具有所有轨道号的第一个组合是一个合适的组合(在上面的示例中,它可以是1,3,5,2,44,3,5,1,2,具体取决于选择了哪种算法来遍历树。 /两种解决方案,但任务是不只是第一个找到所有解决方案。

要遍历树的一种算法是“选择左侧”,如果可能的话,总是选择最左侧的节点(基于先前的示例$availableTracks = [[1,4],[3,5],[2,3,5],[1,2],[2,4]]

Current node [1,4], Select 1, move downwards - $selectedNumbers = [1]
Current node [3,5], Select 3, move downwards - $selectedNumbers = [1,3]
Current node [2,3,5], Select 2, move downwards - $selectedNumbers = [1,3,2]
Current node [1,2], 1 and 2 are only available nodes, both are used, move upwards and continue with different node.
Current node [2,3,5], 2 wasnt suitable, 3 is not suitable (as already used), Select 5, move downwards - $selectedNumbers = [1,3,5].  
Current node [1,2], 1 is not suitable (as already used), Select 2, move downwards - `$selectedNumbers = [1,3,5,2]`
Current node [2,4], 2 is not suitable (as already used), Select 4, array has reached the same length as number of pairs, found suitable.
Final list: `$selectedNumbers = [1,3,5,2,4]`