ZOJ1004 python AC

4 篇文章 0 订阅

周末就松懈了,周一继续码题练手

 

ZOJ1004:https://zoj.pintia.cn/problem-sets/91827364500/problems/91827364503

以后就不放原题了,链接直接看

大致题意:

每次输入两行字符串,第一行字符串通过栈操作变形成第二串字符串,输出所有操作方案,以及每种方案的步骤

规定的栈操作有两种:

1)     i:  入栈操作,将第一行字符串中首字母压入栈

2)    o:  出栈操作,将栈首字母出栈

例子:

madam

adamm

 

步骤原字符串操作栈 结果
初始madam   
1adami[m] 
2dami[m,a] 
3ami[m,a,d] 
4mi[m,a,d,a] 
5mo[m,a,d]a
6mo[m,a]ad
7mo[m]ada
8 i[m,m]ada
9 o[m]adam
10 o[]adamm

 

又是一题简单的暴搜,全状态遍历一遍,然后判断结果就可以了

代码:

# -*- coding: utf-8 -*-

from math import *

result = []

#剪枝判断
def bo():
    data = {}
    for i in x:
        if i in data:
            data[i] += 1
        else:
            data[i] = 1
    for i in y:
        if i in data:
            if data[i] > 0:
                data[i] -= 1
            else:
                return True
        else:
            return True
    return False

#比较传入状态是否和结果一样
def is_result(s): 
    s1=''
    for i in s:
        s1 += i
    if s1 == y:
        return True
    else:
        return False

#输出
def print_result(p):
    for i in p:
        print(i, end=' ')
    print()
    return    

def dfs(i, j, p, s, stack):  #i存储操作次数,j存储x的指针位置, p储存过程操作,s保存现在状态,stack保存栈
    #print(f'i={i},j={j},p={p},s={s},stack={stack}')
    if i >= len(x) * 2:     
        if is_result(s):  #操作次数达到字符串两倍,判断保存的状态是否和第二串字符串匹配,若匹配,则输出
            print_result(p) 
        return
    
    if j < len(x):      #指针还未指到结尾,入栈操作
        p.append('i')
        stack.append(x[j])
        dfs(i + 1, j + 1, p, s, stack)
        p.pop()  #还原
        stack.pop()
        
    if stack:  #栈内有元素,出栈
        p.append('o')
        c = stack.pop()
        s.append(c)
        dfs(i + 1, j, p, s, stack)
        p.pop()  #还原
        s.pop()
        stack.append(c)
    
if __name__ == "__main__":
    try:
        while 1:
            #输入获取
            x = input()
            y = input()
            print('[')

            #剪枝,字母组成不一样,直接退出
            if len(x)!=len(y) or bo():
                print(']')
                continue

            dfs(0, 0, [], [], [])
            
            print(']')

    except Exception:
        pass



   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值