定义一个二维数组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表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。
左上角到右下角的最短路径,格式如样例所示。
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行的蛇形矩阵。
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