周末就松懈了,周一继续码题练手
ZOJ1004:https://zoj.pintia.cn/problem-sets/91827364500/problems/91827364503
以后就不放原题了,链接直接看
大致题意:
每次输入两行字符串,第一行字符串通过栈操作变形成第二串字符串,输出所有操作方案,以及每种方案的步骤
规定的栈操作有两种:
1) i: 入栈操作,将第一行字符串中首字母压入栈
2) o: 出栈操作,将栈首字母出栈
例子:
madam
adamm
步骤 | 原字符串 | 操作 | 栈 | 结果 |
初始 | madam | |||
1 | adam | i | [m] | |
2 | dam | i | [m,a] | |
3 | am | i | [m,a,d] | |
4 | m | i | [m,a,d,a] | |
5 | m | o | [m,a,d] | a |
6 | m | o | [m,a] | ad |
7 | m | o | [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