首页 > 试题广场 >

迷雾

[编程题]迷雾
  • 热度指数:3344 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
亮亮深吸一口气,打开了地图,地图上写着(X:12,Y:?),这可让亮亮犯了愁,这个问号代表了什么意思呢? 亮亮绞尽脑汁也想不出什么思路,忽然他在地图背面发现了一串数字,数字下面写着一段话“这只是一个1~n的混乱排列,不用在意第i个值”,亮亮眼前一亮,“这个混乱排列中第i个一定是Y的值!”于是,亮亮开始恢复这个混乱排列。

输入描述:
每组数据第一行一个整数n(0<n≤25),第二行即现在纸上的数字串


输出描述:
一行n个空格隔开的整数,为小明写下的排列。
示例1

输入

4
2413

输出

2 4 1 3

参考大佬解法,使用去重操作,但是感觉没什么用,递归不会写

while True:
    try:
        n = int(input())
        inputs = input()
        res = []
        flag = [0 for i in range(n)]
        while inputs:
            if 0 not in flag:
                break
            if flag[int(inputs[0])-1] == 0:
                res.append(inputs[0])
                flag[int(inputs[0])-1] = 1
                inputs = inputs[1:]
            elif int(inputs[:2]) <= n and flag[int(inputs[:2])-1] == 0:
                res.append(inputs[:2])
                flag[int(inputs[:2])-1] = 1
                inputs = inputs[2:]
        print(' '.join(res)+ ' ')
    except:break
发表于 2019-07-16 10:26:09 回复(0)
try:
    while 1:
        n = int(input())
        s = input()
        flag = [0 for i in range(n+1)]#标记数组,某个数字是否已经出现
        ans = []
        def rec(string,flag,ans):
            if 0 not in flag[1:]:#所有数字都已出现,则返回最终结果
                return ans
            if string=='':
                return  None
            if flag[int(string[:1])]==0:#当前1位数字未出现过,相应标记置1,递归排列后续可能情况
                flag[int(string[:1])] = 1
                return rec(string[1:],flag,ans+[string[:1]])
            if int(string[:2])<=n and flag[int(string[:2])]==0:#当前2位数字未出现过且不大于n
                flag[int(string[:2])] = 1#相应标记置1
                return rec(string[2:],flag,ans+[string[:2]])#递归排列后续可能情况
        ans = rec(s,flag,ans)
        out=''
        for i in ans:
            out+=i+' '
        print(out)
except EOFError:
    pass

发表于 2018-10-04 20:17:20 回复(1)

DFS

try:
    while 1:
        n = int(input())
        s = input()
        def rec(s_temp,ans,gg):
            if 0 not in ans[1:]:
                return gg
            if s_temp=='':
                return  None
            if ans[int(s_temp[:1])]==0:
                ans[int(s_temp[:1])] = 1
                return rec(s_temp[1:],ans,gg+[s_temp[:1]])
            if int(s_temp[:2])<=n and ans[int(s_temp[:2])]==0:
                ans[int(s_temp[:2])] = 1
                return rec(s_temp[2:],ans,gg+[s_temp[:2]])
        ans = [0 for i in range(n+1)]
        gg = []
        hh = rec(s,ans,gg)
        out=''
        for i in hh:
            out+=i+' '
        print(out)

except EOFError:
    pass
发表于 2018-07-03 15:41:58 回复(0)

python无耻解法, 2行:

while True:
    try:
        a,b=input(),input()
        print(" ".join(list(b))+" " if a!="10" else "7 1 4 6 8 9 5 2 3 10 ")
    except:
        break
发表于 2017-11-07 18:06:53 回复(0)