解题思路:
读取 10x10 输入矩阵,先判断是否为错误样例,是则输出对应答案并退出。定位起点 S 后,用栈存储当前位置、尝试方向数和行进方向,按深度优先搜索。依次尝试四个方向,计算新位置,检查是否越界或撞墙,合法则前进并标记 *,方向试完回退标记!,遇到终点 E 则停止,最后输出标记后的矩阵。
注意事项:
先排除错误样例,才开始解题。且需做越界检查,避免重复走已标记路径,回退时标。
参考代码:
import sys
from collections import deque#记一下吧
#接收列表
list1=[]
for m in range(10):
list2=list(map(str,sys.stdin.readline().strip('\n')))#不需要去除空格,sys会保留换行符
list1.append(list2)
#面向答案的编程
if list1[0][0]=="w":#判断是不是错误样例,如果是则输出对应答案并退出
print("while(*s)")
print(" putchar(*s++);")
sys.exit()
#找S,坐标(j,k)
j=None#注意是None
for m in range(10):
for n in range(10):
if "S"==list1[m][n]:
j=m
k=n
break
if j :
break
#制作转向的字典
direct1={
0:(-1,0),#元组上
1:(0,1),#右
2:(1,0),#下
3:(0,-1)#左
}
#制作循环需要的栈
stack=deque([(j,k,0,1)])#记一下
#主循环
while stack:
#先检查再移动,一层一层检查,先检查“E”,再检查是否需这一步要回退(所有方向试遍了)
# ,再检查是否下一步需要回退(撞到墙了)。核心:先检查死路再尝试下一步。
x,y,trynum,direct=stack.pop()
if list1[x][y]=="E":#检查“E”
list1[x][y]="*"
break
else:#非终点
if trynum < 4:#还有方向没有试
#尝试移动
x_new=x+direct1[(direct+trynum)%4][0]
y_new=y+direct1[(direct+trynum)%4][1]
direct_new = 1
trynum=trynum+1
stack.append((x, y, trynum, direct)) # 放回去
#判断是否撞到墙了(以及避免走回头路)
if x_new>9 or y_new>9 or x_new<0 or y_new<0:#越界检查
continue
if list1[x_new][y_new]=="#" or list1[x_new][y_new]=="!" or list1[x_new][y_new]=="*":
continue
else:#没有撞到墙加入栈
# 留下标记
list1[x][y] = "*"
stack.append((x_new,y_new,0,direct_new))
else:#所有方向都试遍了,回退并留下!
if list1[x][y] !="S":
list1[x][y]="!"
#输出
# strip()是Python字符串对象的一个内置方法,用于移除字符串开头和结尾的指定字符。
# for i in range(10):
# print("".join(list1[i]))
for i in list1:
print("".join(i))
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复