游戏公司面试题:Java如何实现二维逆时针旋转数组

//新建一个数组类

public class   SnakeArray {

//程序入口

 public static void main(String[] args) {

        move(8);

    }

    public static void move(int n) {

    //初始化

        // 新建 n*n的二维数组
        int[][] array = new int[n][n];
        // left表示点左移,right表示点右移,up表示点上移,down表示点下移
        int left = 1;
        int right = 2;
        int up = 3;
        int down = 4;
        // row代表起点所占位置的行数,column代表起点所占位置的列数。
        // value代表起点的值。
        // derection代表起点的移动方向:左移。
        int row = 0;
        int column = n - 1;
        int value = 1;
        array[row][column] = value;
        int derection = left;

//主要逻辑代码

 while (value <n * n) {
            /*
             * 对于n*n阶数组而言,最大值是n*n,最小值是1。 当点的值为最大值时,说明该n*n阶数组的元素已经重新被赋值了。
             */
            switch (derection) {
            case 1:
                // 左移后,行不变,列-1。

                column--;
                // 可能遇到两种情况,越界或者移动之后的位置上的元素已经被重新赋值(也就是说,该位置点已经来过)。
                if (column < 0) {
                    // 情况一:越界。这个时候,点应该右移,回到原来位置,然后下移。
                    column++;
                    derection = 4;
                    continue;
                } else if (array[row][column] != 0) {
                    // 情况二:已经被赋值。这个时候,点应该右移,回到原来位置,然后下移。
                    column++;
                    derection = 4;
                    continue;
                }
                break;
            case 2:
                // 右移后,行不变,列+1。

                column++;
                // 可能遇到两种情况,越界或者移动之后的位置上的元素已经被重新赋值(也就是说,该位置点已经来过)。
                if (column >= n) {
                    // 情况一:越界。这个时候,点应该左移,回到原来位置,然后上移。
                    column--;
                    derection = 3;
                    continue;
                } else if (array[row][column] != 0) {
                    // 情况二:已经被赋值。这个时候,点应该左移,回到原来位置,然后上移。
                    column--;
                    derection = 3;
                    continue;
                }
                break;
            case 3:

                // 上移后,行-1,列不变。

                row--;
                // 可能遇到两种情况,越界或者移动之后的位置上的元素已经被重新赋值(也就是说,该位置点已经来过)。
                if (row < 0) {
                    // 情况一:越界。这个时候,点应该下移,回到原来位置,然后左移。
                    row++;
                    derection = 1;
                    continue;
                } else if (array[row][column] != 0) {
                    // 情况二:已经被赋值。这个时候,点应该下移,回到原来位置,然后左移。
                    row++;
                    derection = 1;
                    continue;
                }
                break;
            case 4:

                // 下移后,行+1,列不变。

                row++;
                // 可能遇到两种情况,越界或者移动之后的位置上的元素已经被重新赋值(也就是说,该位置点已经来过)。
                if (row >= n) {
                    // 情况一:越界。这个时候,点应该上移,回到原来位置,然后右移。
                    row--;
                    derection = 2;
                    continue;
                } else if (array[row][column] != 0) {
                    // 情况二:已经被赋值。这个时候,点应该上移,回到原来位置,然后右移。
                    row--;
                    derection = 2;
                    continue;
                }
                break;
            }

            value++;
            array[row][column] = value;
        }// while语句结束处

//打印结果

 for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(array[i][j] + "\t");
            }
            System.out.println();
        }

 



    }
}

控制台:

posted @ 2012-11-16 11:37  smile看风云  阅读(663)  评论(0编辑  收藏  举报