数字游戏--------》迷宫问题、蛇形矩阵

迷宫问题

题目描述

定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: 
int maze[5][5] = {
        0, 1, 0, 0, 0,
        0, 1, 0, 1, 0,
        0, 0, 0, 0, 0,
        0, 1, 1, 1, 0,
        0, 0, 0, 1, 0,
};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一空格是可以走的路。

Input

一个N × M的二维数组,表示一个迷宫。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。

Output

左上角到右下角的最短路径,格式如样例所示。

Sample Input

0 1 0 0 0

0 1 0 1 0

0 0 0 0 0

0 1 1 1 0

0 0 0 1 0

Sample Output

(0, 0)

(1, 0)

(2, 0)

(2, 1)

(2, 2)

(2, 3)

(2, 4)

(3, 4)

(4, 4)

输入描述:

输入两个整数,分别表示二位数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。

输出描述:

左上角到右下角的最短路径,格式如样例所示。

示例1

输入

5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

输出

(0,0)
(1,0)
(2,0)
(2,1)
(2,2)
(2,3)
(2,4)
(3,4)
(4,4)

解法1

rows = 0  # 迷宫行数
cols = 0  # 迷宫列数
flag = False  # 回退标志


# 判断下一个节点
def go_next(site, maze, path):
    if not (0 <= site[0] < rows and 0 <= site[1] < cols):  # 边界
        return False
    if maze[site[0]][site[1]] == 1:  # 墙壁
        return False
    if maze[site[0]][site[1]] == 2:  # 回退
        return False
    if site in path[:-1]:
        return False
    return True


# 取得结果
def go(site_now, path, site_exit, maze):
    global flag
    site = site_now
    if not flag:
        path.append(site)
    else:
        path.pop()
    for i in [(1, 0), (0, 1), (-1, 0), (0, -1)]:
        site = (path[-1][0] + i[0], path[-1][1] + i[1])
        if go_next(site, maze, path):
            break
        if i in [(0, -1)]:
            flag = True  # 需要回退
            maze[path[-1][0]][path[-1][1]] = 2
        else:
            flag = False  # 不回退
    if path[-1] not in [site_exit]:
        go(site, path, site_exit, maze)


try:
    while True:
        # 当前轨道, 所有轨道, 最优轨道(结果)
        path, paths, res = [], [], []
        flag = False  # 回退标志
        rows, cols = map(int, input().split())
        maze = []
        for i in range(rows):
            maze.append([int(i) for i in input().split()])

        go((0, 0), path, (rows - 1, cols - 1), maze)
        
        if path[-1] in [(rows - 1, cols - 1)]:
            paths.append(path)
        if len(paths) > 0:
            res = sorted(paths)[0]
        
        for i in res:
            print('(%d,%d)' % (i[0], i[1]))
except:
    pass

解法2

try:
    while True:
        row,col = map(int,input().split())
        maze = []
        for i in range(row):
            maze.append(list(map(lambda x:-x,map(int,input().split()))))
        queue = [[0,0]]
        maze[0][0] = 1
        while queue:
            x,y = queue.pop(0)
            if x == row-1 and y == col-1:
                break
            if x+1 < row and maze[x+1][y] == 0:
                maze[x+1][y] = maze[x][y]+1
                queue.append([x+1,y])
            if y+1 < col and maze[x][y+1] == 0:
                maze[x][y+1] = maze[x][y]+1
                queue.append([x,y+1])
            if x-1 >= 0 and maze[x-1][y] == 0:
                maze[x-1][y] = maze[x][y]+1
                queue.append([x-1,y])
            if y-1 >= 0 and maze[x][y-1] == 0:
                maze[x][y-1] = maze[x][y]+1
                queue.append([x,y-1])
        result = [[row-1,col-1]]
        for i in range(maze[-1][-1]-1,0,-1):
            tempRow = result[0][0]
            tempCol = result[0][1]
            if tempRow-1>=0 and maze[tempRow-1][tempCol] == i:
                result.insert(0,[tempRow-1,tempCol])
            elif tempCol-1>=0 and maze[tempRow][tempCol-1] == i:
                result.insert(0,[tempRow,tempCol-1])
            elif tempRow+1

蛇形矩阵

题目说明

蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。

样例输入

5

样例输出

1 3 6 10 15

2 5 9 14

4 8 13

7 12

11

接口说明

原型

void GetResult(int Num, char * pResult);

输入参数:

        int Num:输入的正整数N

输出参数:

        int * pResult:指向存放蛇形矩阵的字符串指针

        指针指向的内存区域保证有效

返回值:

        void

输入描述:

输入正整数N(N不大于100)

输出描述:

输出一个N行的蛇形矩阵。

示例1

输入

4

输出

1 3 6 10
2 5 9
4 8
7

解法1

try:
    while True:
        res, num = [], int(input())
        for i in range(1, num + 1):
            row = []
            for j in range(i, num + 1):
                if not row:
                    if not res:
                        row.append(1)
                    else:
                        row.append(res[0][i - 2] + 1)
                else:
                    row.append(row[j - i - 1] + j)
            res.append(row)
        for i in res:
            print(" ".join([str(j) for j in i]))
except:
    pass

解法2

while True:
    try:
        n, curNum = int(input()), 1  
        res = [[0 for i in range(n)] for j in range(n)]
        for i in range(n):
            for j in range(i + 1):
                res[i - j][j] = curNum
                curNum += 1
        for i in res:
            print(" ".join(map(str, (filter(lambda i: i != 0, i)))))
    except:
        break

 

 

你可能感兴趣的:(python,习题集)