首页 > 试题广场 >

兵临城下

[编程题]兵临城下
  • 热度指数:1197 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
卢卡斯的驱逐者大军已经来到了赫柏的卡诺萨城,赫柏终于下定决心,集结了大军,与驱逐者全面开战。
卢卡斯的手下有6名天之驱逐者,这6名天之驱逐者各赋异能,是卢卡斯的主力。
为了击败卢卡斯,赫柏必须好好考虑如何安排自己的狂战士前去迎战。
狂战士的魔法与一些天之驱逐者的魔法属性是相克的,第i名狂战士的魔法可以克制的天之驱逐者的集合为Si(Si中的每个元素属于[0,5])。
为了公平,两名狂战士不能攻击同一个天之驱逐者。
现在赫柏需要知道共有多少种分派方案。
例:
S1={01},S2={23},代表编号为0的狂战士的魔法可以克制编号为0和编号为1的天之驱逐者,编号为1的狂战士的魔法可以克制编号为2和编号为3的天之驱逐者,共有四种方案:02,03,12,13。
02---代表第一个狂战士负责编号为0的驱逐者,第二个狂战士负责编号为2的驱逐者;
03---代表第一个狂战士负责编号为0的驱逐者,第二个狂战士负责编号为3的驱逐者;
12---代表第一个狂战士负责编号为1的驱逐者,第二个狂战士负责编号为2的驱逐者;
13---代表第一个狂战士负责编号为1的驱逐者,第二个狂战士负责编号为3的驱逐者;
S1={01},S2={01},代表编号为0的狂战士的魔法可以克制编号为0和编号为1的天之驱逐者,编号为1的狂战士的魔法可以克制编号为0和编号为1的天之驱逐者,共有两种方案:01,10。

输入描述:
多组测试数据,请处理到文件结束。
对于每组测试数据:
第一行为一个整数N,代表狂战士的数量。
第二行为N个字符串,第i个字符串表示第i个狂战士能够克制的天之驱逐者的集合。
保证:
1<=N<=6,1<=每个字符串的长度<=6,且每个字符都是0~5中的一个数字。


输出描述:
输出一个整数,代表分配方案数
示例1

输入

2
01 23
2
01 01
3
3 015 5

输出

4
2
2
好坑。
用python在牛客网写算法有个很奇葩的问题,分割字符串如果用line.split()就可以通过,用line.split(' ')就失败 为什么呀,我本地测试这两种分割完全一致呀





正确的源码如下
# -*- coding:utf-8 -*-
#step为第step个空格之前,num共有多少个空格,s为字符串,mark为标记序列
def dfs(step,num,s,mark):
    global number
    if step>=num:
        number+=1
    else:
        sline=s[step]
        for i in sline:
            if mark[int(i)]==0:
                mark[int(i)]=1
                dfs(step+1,num,s,mark)
                mark[int(i)]=0
try:
    while True:
        n = int(raw_input())
        line = raw_input()
        if n == '' or line == '':
            break
        s=line.split()# list
        number=0
        mark=[0,0,0,0,0,0]#标记0-5是否已经出现,初始化为未出现
        dfs(0,n,s,mark)
        print number
except:
    pass
如果修改第20行,提示只通过了一个样例,太奇葩了。。。

发表于 2016-06-22 11:34:26 回复(0)