先来解决这个飞行员兄弟,自己敲的时候,思路上没太大问题,还是细节上。对于蓝桥杯,题目不难,主要看细节。
116
1、写turn函数的时候,寻找更好的方法——直接设一个变量i
2、可以用copy.deepcopy对数组进行复制
3、break只跳出一层循环
-----------枚举法------------
import copy
g = [[0]*5 for _ in range(4)]
ans = []
def get(i,j):
return j+i*4
def turn_one(x,y):
if g[x][y] =='-':
g[x][y]='+'
else:
g[x][y]='-'
def turn(x,y):
for i in range(4):
turn_one(x,i)
turn_one(i,y)
turn_one(x,y)
for i in range(4):
g[i] = list(input())
# 一种有2^16种状态
backup = copy.deepcopy(g)
for x in range(1<<16):
# 每次进行操作前需要备份数组
res = []
# 对于每种可能,进行操作;然后,判断最后是否全开
for i in range(4):
for j in range(4):
# get函数用于将4*4表格中的位置赋予编号,与按键对应
k = get(i,j)
# 查看这一位的操作:1为按,0为不按
if x>>k&1 ==1:
turn(i,j)
res.append([i,j])
# 判断是否全开,使用flag作为标记
flag = True
for i in range(4):
for j in range(4):
if g[i][j]=='+':
flag=False
break
# break只能跳出一层循环
if not flag:
break
if flag:
if len(ans)== 0 or len(ans)>len(res):
ans=copy.deepcopy(res)
g = copy.deepcopy(backup)
print(len(ans))
for i in range(len(ans)):
print(ans[i][0]+1,ans[i][1]+1)
尝试用深搜,但是写不出来,不知道还原现场如何设置,感觉不熟悉,还需要研究一下之前的代码。
真的想哭了这个dfs写了一个小时不知道哪里错了
import copy
g = [[0]*5 for _ in range(4)]
ans = []
st = [0]*20
res = []
def turn_one(x,y):
if g[x][y] =='-':
g[x][y]='+'
else:
g[x][y]='-'
def turn(u):
x = u//4
y = u%4
res.append([x,y])
for i in range(4):
turn_one(x,i)
turn_one(i,y)
turn_one(x,y)
def check():
for i in range(4):
for j in range(4):
if g[i][j]=='+':
return False
return True
# 读入数据
for i in range(4):
g[i] = list(input())
def dfs(u):
global res,ans
if u>15:
# 验证最后是否符合条件
if check():
if len(res)<len(ans) or len(ans)==0:
ans = copy.deepcopy(res)
res = []
else:
# 0代表没有决定,1代表不按,2代表按
st[u]=1
dfs(u+1)
st[u]=0
st[u]=2
turn(u)
dfs(u+1)
dfs(0)
print(len(ans))
for i in range(len(ans)):
print(ans[i][0]+1,ans[i][1]+1)
妈的,好像终于要成功了,又用了50分钟!!!!!!!!!!
import copy
g = [[0]*5 for _ in range(4)]
ans = []
st = [0]*20
res = []
def turn_one(x,y):
if g[x][y] =='-':
g[x][y]='+'
else:
g[x][y]='-'
def turn(u):
x = u//4
y = u%4
# res.append([x,y])
for i in range(4):
turn_one(x,i)
turn_one(i,y)
turn_one(x,y)
def check():
for i in range(4):
for j in range(4):
if g[i][j]=='+':
return False
return True
# 读入数据
for i in range(4):
g[i] = list(input())
def dfs(u):
global res,ans
if u==16:
# 验证最后是否符合条件
if check():
if len(res)<len(ans) or len(ans)==0:
ans = copy.deepcopy(res)
else:
# 0代表没有决定,1代表不按,2代表按
st[u]=1
dfs(u+1)
st[u]=2
turn(u)
x = u//4
y = u%4
res.append([x,y])
dfs(u+1)
res = res[:-1]
turn(u)
dfs(0)
print(len(ans))
for i in range(len(ans)):
print(ans[i][0]+1,ans[i][1]+1)
这题很好!!!!!!
2个小时的hard work也值得,对dfs的理解更加深入了!!调bug能力也变强了!
1、一定要恢复现场,把能恢复的都恢复,保持和原来一样,这题里我们一直忽略了res。
2、要把函数功能单一化,这里我们在turn中掺杂了res的append,导致恢复时不好恢复现场。
3、x = u//4;y=u%4