矩阵的是比较常用的,尤其是matlab中。数据结构中也介绍过几种特殊的矩阵,但是怎么去实现它呢?看上去很简单,但是真正去实现还是有点困难的,这类题目也可能是很难得,必须认识到规律才好做出来。

   下面介绍几种我见过的比较常见的矩阵,以5阶为例,后面会有扩展练习之类的,附上主要代码,仅供参考。

1.一般矩阵

wKiom1NSjwaRHp6dAABR-h4uE1U961.jpg


2.S形矩阵

wKioL1NSjxCQkXUGAABi0d9Z1Uo177.jpg


3.Z形矩阵

wKiom1NSj2jxWXFfAABOjkegdrk464.jpg


4.回形矩阵

wKiom1NSj5eTQt48AABSOfPaYCE529.jpg


一般的Z形和回形矩阵被称作蛇形矩阵。

上面四种的常见代码如下:

import java.util.Scanner;
/**
 * @author WANGXIN by 2014-4-17下午4:46:51
 * @version v1.0 TODO
 */
public class TestMatrix {
    static int[][] a;
    static int t = 1;
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("输入一个数(代表矩阵的规模):");
        int n = Integer.valueOf(input.nextLine());
        matrix1(n);
        matrix2(n);
        matrix3(n);
        matrix4(n);
    }
    // 正常矩阵
    public static void matrix1(int n) {
        a = new int[n][n];
        t = 1;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                a[i][j] = t++;
            }
        }
        System.out.println("\n\n一般矩阵");
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(a[i][j] + "\t");
            }
            System.out.println();
        }
    }
    // S形矩阵
    public static void matrix2(int n) {
    a = new int[n][n];
        t = 1;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (i % 2 == 0) {
                    a[i][j] = t++;
                } else {
                    a[i][n - j - 1] = t++;
                }
            }
        }
        System.out.println("\n\nS形矩阵");
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(a[i][j] + "\t");
            }
            System.out.println();
        }
    }
    // 回形矩阵
    public static void matrix3(int n) {
        System.out.println("\n\n回形矩阵:");
        t = 1;
        a = new int[n][n];
        matrix3_2(1, 0, 0, n);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(a[i][j] + "\t");
            }
            System.out.println();
        }
    }
    public static void matrix3_2(int tag, int x, int y, int num) {
        if (t > a.length * a.length) {
            return;
        }
        if (tag == 1) {
            for (int i = y; i < y + num; i++) {
                a[x][i] = t++;
            }
            matrix3_2(tag + 1, x + 1, y + num - 1, num - 1);
        } else if (tag == 2) {
            for (int i = x; i < x + num; i++) {
                a[i][y] = t++;
            }
            matrix3_2(tag + 1, x + num - 1, y - 1, num);
        } else if (tag == 3) {
            for (int i = y; i > y - num; i--) {
                a[x][i] = t++;
            }
            matrix3_2(tag + 1, x - 1, y - num + 1, num - 1);
        } else if (tag == 4) {
            for (int i = x; i > x - num; i--) {
                a[i][y] = t++;
            }
            matrix3_2(tag - 3, x - num + 1, y + 1, num);
        }
    }
    // Z形矩阵
    public static void matrix4(int n) {
        a = new int[n][n];
        t = 1;
        int i = 0;
        int j = 0;
        a[0][0] = t++;
        for (; t <= n * n;) {
            if (i < n && i - 1 >= 0 && j + 1 < n && a[i - 1][j + 1] == 0) {
                a[i - 1][j + 1] = t++;
                i -= 1;
                j += 1;
            } else if (i + 1 < n && j < n && j - 1 >= 0 && a[i + 1][j - 1] == 0) {
                a[i + 1][j - 1] = t++;
                i += 1;
                j -= 1;
            } else if (j == 0 && i + 1 < n) {
                a[i + 1][j] = t++;
                i += 1;
            } else if (i == 0 && j + 1 < n) {
                a[i][j + 1] = t++;
                j += 1;
            } else if (i == n - 1 && j + 1 < n) {
                a[i][j + 1] = t++;
                j += 1;
            } else if (j == n - 1 && i + 1 < n) {
                a[i + 1][j] = t++;
                i += 1;
            }
        }
        System.out.println("\n\n\nZ形矩阵:");
        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                System.out.print(a[i][j] + "\t");
            }
            System.out.println();
        }
    }
}




5.变形

wKioL1NSkBXwp8JgAAAbdTYJLuA002.jpg


6.扩展

wKioL1NSkEPRYMHZAABDnjSwYTE315.jpg

wKiom1NSkG2QViizAABC2DHnzDk163.jpg


5,6需要思考如何实现,其中6比较难,需要转化为相应的矩阵,且必须能看出规律。

其实6的代码在算法,蛇形矩阵中已经给出过。


import java.util.Scanner;
/**
 * @author WANGXIN by 2014-3-29下午1:21:48
 * @version v1.0
 */
public class SnakeMatrix {
    public static void main(String[] args) {
        int M;
        int N;
        System.out
                .println("Please input the Snake-Matrix`s rows and columns: ");
        System.out.print("rows = ");
        @SuppressWarnings("resource")
        Scanner scanner = new Scanner(System.in);
        M = scanner.nextInt();
        System.out.print("columns = ");
        N = scanner.nextInt();
        System.out.println("Snake-Matrix(" + M + " , " + N + ")");
        printSnake(M, N);
    }
    /**
     * display the Snake-Matrix
     *
     * @param M
     *            the row of the Matrix
     * @param N
     *            the columns of the Matrix
     */
    public static void printSnake(int M, int N) {
        int num = 0;
        int i = 0;
        int j = 0;
        int x = 0;
        int y = 0;
        int[][] arr = new int[M][N];
        char[][] str = new char[M][N];
        int min = M > N ? N : M;
        min = (int)Math.round(min / 2.0 + 0.5);
        while (true) {
            for (i = x; i <= M - 1 - x; i++) {
                if (num == M * N)
                    break ;
                arr[i][N - 1 - y] = ++num;
                str[i][N - 1 - y] = '↓';
            }
            y++;// decrease y line(s)
            for (j = N - 1 - y; j >= y - 1; j--) {
                if (num == M * N)
                    break ;
                arr[M - y][j] = ++num;
                str[M - y][j] = '←';
            }
            x++;// decrease x line(s)
            for (i = M - 1 - x; i >= x - 1; i--) {
                if (num == M * N)
                    break ;
                arr[i][y - 1] = ++num;
                str[i][y - 1] = '↑';
            }
            for (j = y; j < N - y; j++) {
                if (num == M * N)
                    break ;
                arr[y - 1][j] = ++num;
                str[y - 1][j] = '→';
            }
            if (y == min || x == min) {
//              System.out.println("x = " + x  + " y = "+ y);//label is not the most efficient
                break;
            }
        }
        System.out.println();
        for (int k = 0; k < M; k++) {
            for (int k2 = 0; k2 < N; k2++) {
                System.out.print(arr[k][k2] + "\t");
            }
            System.out.println();
        }
        System.out.println();
        System.out.println("-----------direction show as follow------------");
        for (int k = 0; k < M; k++) {
            for (int k2 = 0; k2 < N; k2++) {
                System.out.print(str[k][k2] + "\t");
            }
            System.out.println();
        }
    }
}