Python PEG在线判断编码
我在PEG Online Judge上解决一个问题,这是一个你可以通过练习和娱乐解决很多问题的网站 我特别有一个问题。我已经张贴在那里寻求帮助,但没有收到任何 这是资本体制的问题: 您可以使用多种语言来解决此问题。我决定了Python(虽然我也用C++编码了)。法官在测试代码时使用了12个数据集。我的代码通过11/12。我不知道为什么我不能通过最后一次考试,我希望有人能帮助我 我认为这是某种类型的集合划分问题,我用广度优先的搜索方法来解决它。问题数据集不大,因此不会失控 以下是我的解决方案: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
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速度更快,占用的内存更少。这是一个问答网站。你的问题是什么?具体一点。你的问题并没有真正表现出你努力让它成为可回答的问题。解释一下你的通用算法会很有帮助。你的代码为什么要工作?你有什么理由认为你的算法是正确的?嗯,好吧,我不知道如何才能更全面地解释它。你必须有兴趣阅读我提供的链接上的问题陈述。因此,这充分说明了问题所在。然后我继续说这是一个集合划分问题,我正在使用广度优先搜索算法来尝试找到集合的最小数量。我想我可以写一页又一页关于这些东西的文章,但是假设人们想要一个简短的条目?所以我的问题是“为什么我不能为在线法官使用的所有数据集得到正确的答案?”我肯定在某个地方出错了,或者没有考虑某些测试用例。所以这段代码在最后一次测试中失败了。我看不到那个测试(这是在线法官的工作方式),所以我无法说出数据是什么,也无法解释为什么我的代码在那个特定的数据集上失败。