回型矩阵
问题描述
打印回型矩阵
1 2 3
6 5 4
算法思路
- 使用一个二维数组
arrs
来存放数据,需要存放数据是因为后面会使用的到 - 控制"蛇头",遇到边界和障碍就改变方向
代码示例
Python
# 控制蛇头:
# 1. 遇到边界/已经填了数子的格子就改变方向
def fill_mat():
# r,c控制"蛇头"
r = 0
c = 0
# 方向控制
direction = "right"
for x in range(1, row * col + 1):
mat[r][c] = x
# 确定下一个方向
direction = find_last_direction(direction, r, c)
if direction == "up":
r -= 1
elif direction == "down":
r += 1
elif direction == "left":
c -= 1
else:
c += 1
def find_last_direction(direction, r, c):
if direction == "up":
if r > 0 and mat[r - 1][c] == 0:
return direction
else:
return "right"
elif direction == "down":
if r < row - 1 and mat[r + 1][c] == 0:
return direction
else:
return "left"
elif direction == "left":
if c > 0 and mat[r][c - 1] == 0:
return direction
else:
return "up"
else:
if c < col - 1 and mat[r][c + 1] == 0:
return direction
else:
return "down"
def print_mat():
for i in range(len(mat)):
for j in range(len(mat[0])):
print("%2d" % mat[i][j], end=" ")
print()
row, col = 8, 8
mat = [[0] * col for x in range(row)] # 构建一个全0的二维列表
fill_mat()
print_mat()
Java
public class 回型矩阵 {
// 使用一个二维数组来存放这个矩形
static int[][] arrs;
static void init(int row, int col) {
arrs = new int[row][col];
}
// 类似于贪吃蛇,碰到 边界 或 障碍 就改变方向
static void fillArrs() {
// r,c 分别控制行列坐标
int r = 0;
int c = 0;
String lastDirection = "right"; // 初始方向为右
for (int i = 1; i <= arrs[0].length * arrs.length; i++) { // 要打印多少个数来控制循环
arrs[r][c] = i;
lastDirection = findLastDirection(lastDirection, r, c);
if ("up".equals(lastDirection)) {
r--;
} else if ("down".equals(lastDirection)) {
r++;
} else if ("left".equals(lastDirection)) {
c--;
} else {
c++;
}
}
}
static String findLastDirection(String lastDirection, int r, int c) {
if ("up".equals(lastDirection)) {
if (r > 0 && arrs[r - 1][c] == 0) {
return lastDirection;
} else {
return "right";
}
} else if ("down".equals(lastDirection)) {
if (r < arrs.length - 1 && arrs[r + 1][c] == 0) {
return lastDirection;
} else {
return "left";
}
} else if ("left".equals(lastDirection)) {
if (c > 0 && arrs[r][c - 1] == 0) {
return lastDirection;
} else {
return "up";
}
} else {
if (c < arrs[0].length - 1 && arrs[r][c + 1] == 0) {
return lastDirection;
} else {
return "down";
}
}
}
static void print(){
for(int i=0;i<arrs.length;i++){
for(int j=0;j<arrs[0].length;j++){
System.out.printf("%2d ",arrs[i][j]);
}
System.out.println();
}
}
public static void main(String[] args) {
init(10,10);
fillArrs();
print();
}
}