以螺旋形式输出方阵的所有元素

时间:2017-04-23 10:13:05

标签: java

任务如下:

  

给出了阶数为M的方阵A.从元素A0,0开始并顺时针移动,您应该以螺旋形式输出所有元素:第一行,最后一列,相反顺序的最后一行,第二列的顺序相反,第二行的其余元素等等。

public class Pres10Task8 {

    public static void main(String[] args) {
        int m =4;

        int [][] a=new int [m][m];
        Random rand = new Random();
        for(int i =0;i<a.length;i++){
            for(int j =0;j<a[i].length;j++){
                a[i][j]=rand.nextInt(100);
                System.out.print(a[i][j]+" ");
            }
            System.out.println();
        }
        for(int k=0;k<m/2+1;k++){
            for(int j = k; j<m+1-k;j++){
                System.out.println(a[k][j]);
            }
            int j =m+1-k;
            for(int i=k+1;i<m+1-k;i++){             
                System.out.println(a[i][j]);
            }

            for(int j=m-k;j>k;j--){
                 j =k ;
                System.out.println(a[i][j]);
            }
            for(int i =m-k;i>k+1;i-- ){
                 i =m+1-k;
                System.out.println(a[i][j]);
            }
        }
    }

}

您是否善于查看我的代码并说出它有什么问题?我应该如何重写代码才能获得正确的输出?

3 个答案:

答案 0 :(得分:0)

在方法之前,您无法在循环中使用变量:

int j = m + 1 - k;
//  ^--------------------------------------Already exist
for (int i = k + 1; i < m + 1 - k; i++) {
    System.out.println(a[i][j]);
}

for (int j = m - k; j > k; j--) {
//       ^---------You can't declare a variable already exist, 
                   //you can just use it or initialize it

所以请在没有int j的情况下使用它:

 for (j = m - k; j > k; j--) {

<强>第二

System.out.println(a[i][j]);
//                   ^-----The i is not exist so you have to 
                         //create it and inisialize it so you can use it

答案 1 :(得分:0)

你在答案中提到的YCF_L犯了很多错误,在解决了其中的一些问题后,我仍然遇到其他错误。您可以通过Divide Square Matrixsmaller squares的简单逻辑解决此问题,然后按照相同的模式打印每个squares

例如,

假设我有一个5阶矩阵,那么我们可以在3 squares处获得不同的维度。

1 1 1 1 1 
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1

此处每个数字代表element所属的方格。所有外部元素都属于first square,然后下一层的元素属于second square,依此类推。

现在,通过将问题分成更小的sub-problems,您可以更轻松地解决问题,这可以通过相同的方式解决。现在你需要制作打印每个squares的元素的逻辑。

因此,考虑最外层的广场。

1 1 1 1 1                                        1  2  3  4  5
1       1       Thier Printing Order             16          6
1       1       ================>                15          7
1       1                                        14          8
1 1 1 1 1                                        13 12 11 10 9

请注意,我们start first element,然后same row进入right direction

然后将same column移入down direction

然后又在same row中的left direction

最后在same column但在up direction

打印outer square移至inner square并为squares中的每一个执行相同操作。

相同的代码:

import java.util.Scanner;
import java.util.Random;

public class Main {

    public static void main(String[] args) {

        int m =4;

        int [][] a=new int [m][m];
        Random rand = new Random();
        for(int i =0;i<a.length;i++){
            for(int j =0;j<a[i].length;j++){
                a[i][j]=rand.nextInt(100);
                System.out.print(a[i][j]+" ");
            }
            System.out.println();
        }

        int squares=m/2;                               //Calculating total number of squares

        for(int i=0;i<squares;i++)
        {
            int low=i;                             //Set the dimension of the square
            int high=m-i-1; 

            for(int j=low;j<=high;j++)             //First Row --> (Right Direction)
                System.out.println(a[low][j]);
            for(int j=low+1;j<=high;j++)           //Last Column --> (Down Direction)
                System.out.println(a[j][high]);
            for(int j=high-1;j>=low;j--)           //Last Row --> (Left Direction)
                System.out.println(a[high][j]);
            for(int j=high-1;j>low;j--)            //First Column --> (Up Direction)
                System.out.println(a[j][low]); 
        }

        if(m%2==1)                                 //If Matrix is of odd order then print the middle element.
            System.out.println(a[mid][mid]);
    }

}

答案 2 :(得分:0)

为什么使用锯齿状数组[][]而不是2维[,]? 可以给出一个简单的样本:

public void CountDiag(int size)
    {
        // initialize straight order
        int[,] ar2 = new int[size, size];
        int count = 0;
        // initialize spiral way
        int y = 0;
        int x = 0;
        int top = 0;
        int bot = ar2.GetLength(0)-1;
        int left = 0;
        int right = ar2.GetLength(1)-1;
        do
        {
            //topleft to right
            for (; y < right; y++)
            {
                ar2[x, y] = count + 1;
                count++;
            }
            ar2[x, y] = count + 1;                
            right--;
            //topright to bottom
            for (; x < bot; x++)
            {
                ar2[x, y] = count + 1;
                count++;
            }
            ar2[x, y] = count + 1;                
            top++;
            //botright to left
            for (; y > left; y--)
            {
                ar2[x, y] = count + 1;
                count++;
            }
            ar2[x, y] = count + 1;
            left++;
            //botleft to top
            for (; x > top; x--)
            {
                ar2[x, y] = count + 1;
                count++;
            }
            ar2[x, y] = count + 1;
            bot--;
        } while (count < ar2.Length-1);

}

你打印出来就像这样:

public void PrintArray(int[,] array)
    {
        int n = (array.GetLength(0) * array.GetLength(1) - 1).ToString().Length + 1; // for padding

        for (int i = 0; i < array.GetLength(0); i++) // 0 - length rows
        {
            for (int j = 0; j < array.GetLength(1); j++) // 1  length columns
            {
                Console.Write(array[i, j].ToString().PadLeft(n, ' '));
            }
            Console.WriteLine();
        }
        Console.ReadLine();
    }