PEG Online Judge Coding

时间:2016-07-29 23:24:19

标签: python algorithm data-structures breadth-first-search

我正在解决PEG Online Judge上的一个问题,这是一个可以解决许多练习和乐趣问题的网站。

我特别遇到麻烦。我已经在那里寻求帮助,但我没有收到任何帮助。

这是Caporegime问题:http://wcipeg.com/problem/capos

您可以使用多种语言来解决此问题。我决定使用Python(虽然我也用C ++编写了它)。法官在测试代码时使用了12个数据集。我的代码通过11/12。我不知道为什么我不能通过最后一次测试,希望有人可以帮助我。

我认为这是一种设置的分区问题,我采用广度优先搜索方法解决它。问题数据集并不大,所以它不会失控。

这是我的解决方案:

import sys
import copy

class SearchState():
    def __init__(self, label, crews):
        self.label = label
        self.crews = crews

    def __repr__(self):
        return "State: %s: %s" % (self.label, str(self.crews))


def crewsSoldierCanBeIn(s, crews, grudges):
    '''
      For a given soldier and a list of crews and grudges,
      return the crews the soldier an go in
    '''

    noGrudgeCrews = []
    for i, crew in enumerate(crews):
        conflict = False
        for c in crew:
            if [s, c] in grudges or [c, s] in grudges:
                conflict = True
                break
        if not conflict:
            noGrudgeCrews.append(i)

    return noGrudgeCrews    


def solve(numSoldiers, grudges):
    '''
      Put each soldier in a crew, output min no. of crews and who is in them
    '''

    crews = [[1]]
    numStates = 0
    states = [SearchState(numStates, crews)]

    for s in range(2, numSoldiers+1):
        newStates = []
        for state in states:
            possibleCrews = crewsSoldierCanBeIn(s, state.crews, grudges)
            if len(possibleCrews) > 0:
                for crew in possibleCrews:
                    numStates += 1
                    newCrews = copy.deepcopy(state.crews)
                    newCrews[crew].append(s)
                    newStates.append(SearchState(numStates, newCrews))
            else:
                numStates += 1
                newCrews = copy.deepcopy(state.crews)
                newCrews.append([s])
                newStates.append(SearchState(numStates, newCrews))

        states = copy.deepcopy(newStates)


    minNumCrews = 1000000
    minState = -1
    for i, state in enumerate(states):
        if len(state.crews) < minNumCrews:
            minNumCrews = len(state.crews)
            minState = i


    print(len(states[minState].crews))
    for crew in states[minState].crews:
        for s in crew:
            print("%d " % (s),  end = "")
        print()

def readInData(f):

    numSoldiers, numGrudges = map(int, f.readline().strip().split())
    grudges = []
    for _ in range(numGrudges):
        grudges.append(list(map(int, f.readline().strip().split())))

    return numSoldiers, grudges


def main():

    # Read in the data
    f = sys.stdin

    numSoldiers, grudges = readInData(f)

    solve(numSoldiers, grudges)

if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:0)

好的,所以我终于解决了这个问题。

基本上我需要使用DFS方法,它可以通过BFS真正解决(通过在线Judge的内存和时间限制)。

DFS的优势有两个:1)我可以相当快地达到一个解决方案(不是最好的解决方案)并使用它来修剪树,摆脱大量的永远不会有任何好处的部分解决方案2)需要很少的记忆。

因此,对于这个问题,DFS速度更快,占用内存更少。