试题

试题 试卷

logo

题型:综合题 题类: 难易度:困难

浙江省嘉兴市2023年9月高三信息技术模拟检测卷

最短路径问题。以 m*n 个边长为 1 的正方形组成的矩形,各顶点按行优先从 0 开始编号,如图 a 所示为 3*2 的矩形及顶点编号。从顶点 x(起点)经由各正方形的边移动到顶点 y(终点)有多种移动 路径,编程求解所有的最短路径。

图 a

图 b

(1)、分析问题,将矩形转换为计算机可处理的数据。可采用列表存储矩形中各顶点的相邻关系,如图 b所示。

编写函数init,根据横向和纵向的正方形数量,返回所有顶点及其所有的相邻顶点数据。完善程序,在划线处填入合适的代码。

def init(m,n):

    tot=(m+1)*(n+1)    #顶点总数

    lst=[[] for i in range(tot)]

    for i in range(tot):

        if i>m:

            lst[i].append(i-m- 1)

        if i<(m+1)*n:

            lst[i].append(i+m+1)

        if i%(m+1) != 0:

            lst[i].append(i- 1)

        if i%(m+1) != m:

           

    return lst

(2)、分析问题,查找所有从起点到终点的最短路径。例如:查找从起点1到终点10的所有最短路径,可先查找终点10的所有相邻顶点(6,9,11),然后再逐个查找顶点6、9、11的相邻顶点,直到查找到起点1,获得所有最短路径,如图c所示,共有3条长度为3的最短路径,分别为1→2→6→10,1→5→6→10,1→5→9→10。若从起点4到终点11,共有 (填数字)条最短路径。

图 c

(3)、分析问题,存储查询到的路径。可采用链表结构保存路径数据,例如:查找从起点1到终点10的所有最短路径,首先将终点10的数据[10,0,-1]保存在path[0]中,然后将其相邻顶点6、9、11的数据保存到path中,path[i][0]保存顶点的编号,path[i][1]保存当前顶点到终点的距离,path[i][2]保存下一顶点在path中的位置,其值为-1表示当前顶点为终点。

编写函数print_path,输出所有的最短路径。完善程序,在划线处填入合适的代码。

def print_path(x,path,length):    #为起点编号,length为Path中有效元素个数。

    cnt=0

    for i in range(length):

        if path[i][0] == x:

            cnt+= 1

        s="最短路径"+str(cnt)+":"

        v=path[i]

        while  :

            s=s+str(v[0])+","

            v=path[v[2]]

        s=s+str(v[0])+" 。"

        print(s)

(4)、实现上述功能的 Python程序如下,运行结果如图 d 所示。请在划线处填入合适的代码。

m=3           #横向正方形数量

n=2              #纵向正方形数量

mtx=init(m,n)

x=int(input("请输入起点:"))

y=int(input("请输入终点:"))

path=[[] for i in range(30)]

passed=[False]*len(mtx)    #保存顶点是否已途经

dis=0

head=0

tail=0

path[tail]=[y,0,- 1]

tail+= 1

passed[y]=True

while not found:

    dis+= 1

    pass_dis=[False]*len(mtx)

    tmp=tail

    for i in range(head,tail):

        v=path[i]

        for d in mtx[v[0]]:

            if not passed[d]:

                path[tail]=

                tail+= 1

                pass_dis[d]=True

            if d == x:

                found=True

        head=tmp

    for i in range(len(mtx)):    #标记已途经的顶点

        if  :

            passed[i]=True

#输出结果

print_path(x,path,tail)

举一反三
给定区间[a1,a2]和[b1,b2],若a2≥b1,则认为这两个区间是有重叠的,可进行合并。如区间[1,3]和[2,6]可合并为[1,6];区间[1,6],[2,5]可合并为[1,6];区间[1,4]和[4,5]可合并为[1,5]。

编写一个“合并重叠区间”的VB程序,功能如下:在文本框Text1中按各区间起始值升序依次输入各区间的起始值和终止值(数据都用逗号分隔并以逗号结尾),单击“确定”按钮后,在Text2中显示合并后的各个区间。例如,在文本框Text1中输入“1,2,3,5,4,6,9,12,10,11,”,表示区间[1,2],[3,5],[4,6],[9,12],[10,11],合并后的区间分别为[1,2],[3,6],[9,12]。程序运行界面如图所示,实现上述功能的VB代码如下:

Const n=100

Private Sub Cmd1_Click()

    Dim i As Integer, k As Integer, L As Integer, R As Integer

    Dim s As String, c As String, t As String, result As String

    Dim a(1 To n) As Integer

    s=   ①   : t=" ": k=0

    For i=1 To Len(s)

        c=Mid(s, i, 1)

        If c<>"," Then

                 ②      

        Else

            k=k+1

            a(k)=Val(t)

            t=""

        End If

    Next i

    L=a(1): R=a(2)

    i=3

    Do While i<=k

        If a(i)>R Then

            result = result+"("+Str(L)+","+Str(R)+"),"

            L=a(i): R=a(i+1)

       

            R=a(i+1)

        End If

            ③   

    Loop

    result=result+"("+Str(L)+","+Str(R)+"),"

    Text2. Text=result

End Sub

返回首页

试题篮