Python PEG在线判断编码

Python PEG在线判断编码,python,algorithm,data-structures,breadth-first-search,Python,Algorithm,Data Structures,Breadth First Search,我在PEG Online Judge上解决一个问题,这是一个你可以通过练习和娱乐解决很多问题的网站 我特别有一个问题。我已经张贴在那里寻求帮助,但没有收到任何 这是资本体制的问题: 您可以使用多种语言来解决此问题。我决定了Python(虽然我也用C++编码了)。法官在测试代码时使用了12个数据集。我的代码通过11/12。我不知道为什么我不能通过最后一次考试,我希望有人能帮助我 我认为这是某种类型的集合划分问题,我用广度优先的搜索方法来解决它。问题数据集不大,因此不会失控 以下是我的解决方案: i

我在PEG Online Judge上解决一个问题,这是一个你可以通过练习和娱乐解决很多问题的网站

我特别有一个问题。我已经张贴在那里寻求帮助,但没有收到任何

这是资本体制的问题:

您可以使用多种语言来解决此问题。我决定了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()
导入系统 导入副本 类SearchState(): 定义初始(自我、标签、乘员): self.label=标签 self.crews=crews 定义报告(自我): 返回“状态:%s:%s”%(self.label,str(self.crews)) def crewsSoldierCanBeIn(s、乘员、怨恨): ''' 对于一个给定的士兵和一系列的船员和怨恨, 把士兵送回部队,让他们进去 ''' nogradgecrews=[] 对于i,枚举中的乘员(乘员): 冲突=错误 对于c级机组: 如果[s,c]怀恨在心或[c,s]怀恨在心: 冲突=真 打破 如果没有冲突: Nogradgecrews.附加(i) 返回Nogradgecrews def solve(numSoldiers,怨恨): ''' 将每个士兵放入一个乘员组,输出乘员组的最小数量以及乘员组中的人员 ''' 船员=[[1]] numStates=0 状态=[搜索状态(numStates,crews)] 对于范围内的s(2,numSoldiers+1): newStates=[] 对于州中的州: 可能的消息=士兵的消息(s,state.crews,gredges) 如果len(可能的报告)>0: 对于可能的新闻中的船员: numStates+=1 newCrews=copy.deepcopy(state.crews) 新船员[船员]。追加 append(SearchState(numStates,newCrews)) 其他: numStates+=1 newCrews=copy.deepcopy(state.crews) newCrews.append([s]) append(SearchState(numStates,newCrews)) states=copy.deepcopy(newStates) minNumCrews=1000000 minState=-1 对于i,在枚举中列出(状态): 如果len(州船员)好的,我终于解决了这个问题

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

DFS的优点有两个:1)我可以相当快地找到一个解决方案(不是最好的解决方案),并使用它来修剪树,以消除成堆永远不会好的部分解决方案;2)所需的内存很少


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

这是一个问答网站。你的问题是什么?具体一点。你的问题并没有真正表现出你努力让它成为可回答的问题。解释一下你的通用算法会很有帮助。你的代码为什么要工作?你有什么理由认为你的算法是正确的?嗯,好吧,我不知道如何才能更全面地解释它。你必须有兴趣阅读我提供的链接上的问题陈述。因此,这充分说明了问题所在。然后我继续说这是一个集合划分问题,我正在使用广度优先搜索算法来尝试找到集合的最小数量。我想我可以写一页又一页关于这些东西的文章,但是假设人们想要一个简短的条目?所以我的问题是“为什么我不能为在线法官使用的所有数据集得到正确的答案?”我肯定在某个地方出错了,或者没有考虑某些测试用例。所以这段代码在最后一次测试中失败了。我看不到那个测试(这是在线法官的工作方式),所以我无法说出数据是什么,也无法解释为什么我的代码在那个特定的数据集上失败。