回型矩阵

回型矩阵

问题描述

打印回型矩阵
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();
    }

}

猜你喜欢

转载自www.cnblogs.com/Rowry/p/11824256.html