一个算法题实现回旋转圈矩阵

实现回旋转圈矩阵,比如输入3,从中心开始转圈输出如下图所示

int i=3;
7   8   9
6   1   2
5   4   3
  • 思路
    方案一:先确定起始点位,然后顺时针按步走,如果下一步的点位有值就保持原来的前进方向走一步。
    方案二:先确定最终点位,然后逆时针按步走,如果到达边界就转换方向。
public class CircleMatrix {

    // 回旋转圈矩阵
    public static void main(String[] args){

        int x = 5;

        // 初始化x乘x矩阵,点位初始值为0
        int[][] matrix = new int[x][x];

		// 初始化,i,j是坐标点位;z表示上一步前进的方向;value是点位上的值
        int i=0,j=0,z=0, value=1;

        // 确定起始点位,奇偶数的起始点位不同
        if (isOddNumber(x)){
            i = ((int) x/2)+1-1;
        } else {
            i = (int) x/2-1;
        }
        j=i;

        // 遍历每一个点位
        for (int n=0; n<x*x; n++){
            matrix[i][j] = value;

            if (z == 0){
                j++;
                z=1;
            } else if (z == 1){
                // 如果前面向右走,现在应该向下走,向下点位有值就继续向右走
                if (i+1 < x && matrix[i+1][j] == 0){
                    i++;
                    z=2;
                } else {
                    j++;
                }
            } else if (z == 2){
                // 如果前面向下走,现在应该向左走,向左点位有值就继续向下走
                if (j-1 >=0 && matrix[i][j-1] == 0){
                    j--;
                    z=3;
                } else {
                    i++;
                }
            } else if (z == 3){
                // 如果前面向左走,现在应该向上走,向上点位有值就继续向左走
                if (i-1 >=0 && matrix[i-1][j] == 0){
                    i--;
                    z=4;
                } else {
                    j--;
                }
            } else if (z == 4){
                // 如果前面向上走,现在应该向右走,向右点位有值就继续向上走
                if (j+1 < x && matrix[i][j+1] == 0){
                    j++;
                    z=1;
                } else {
                    i--;
                }
            }

            // 矩阵计数点位值加1
            value++;
        }

        // 输出结果
        for (int[] rows:matrix) {
            for (int v:rows) {
                System.out.print(v + "\t");
            }
            System.out.println();
        }


    }

    // 判断数值i是否是奇数,i小于0时返回false
    public static boolean isOddNumber(int i){
        if (i<0) {
            throw new RuntimeException("参数不符合规范");
        }
        return i%2 == 1;
    }

}
int i=4;
7	8	9	10	
6	1	2	11	
5	4	3	12	
16	15	14	13	

int i=5;
21	22	23	24	25	
20	7	8	9	10	
19	6	1	2	11	
18	5	4	3	12	
17	16	15	14	13	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值