解题思路:
  读取 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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论