显示矩阵以获得独特的模式

时间:2014-03-05 14:14:05

标签: java

我想构造一个大小为n的方阵(2D)(将由用户输入) 现在我想构建一个对角线模式。 例如(3X3矩阵):

                       2        3
                           1
                       4        5

value变量将初始化为1并存储在方阵的中心。然后value将递增并存储在左上角,如上所示,依此类推。

这是一个在控制台上显示的简单程序。 用户输入可以从命令行获取。 我试图在for循环中推广一个条件,该条件适用于大小为5,7,9 ...(奇数)的方阵。 对于大小为5的矩阵,它将是

                       6               7 
                           2        3
                               1
                           4        5
                       8               9

(空格可以为零)

我的代码:

import java.util.*;    

public class MatrixAdv  
{
    public static void main(String args[])    
    {
        Scanner sc=new Scanner(System.in);

        System.out.println("Please enter size of element...");

        int n=sc.nextInt();    //stores size of Matrix
        int value=0;    //To be incremented everytime to get the Pattern

        int [][] matrix = new int[n][n];

        int k=0;
        for(int i=0;i<some Condition;i++)
        {
            for(int j=1;j<some Condition;j++)
            {                   
                k=n-2-j; 
                matrix[k][k]=++value;
            }     
        } 
    }

    //Display the value in matrix form
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {  
            Print(matrix[i][j]+"\t");
        }
        Print("\n");
    }
}

2 个答案:

答案 0 :(得分:2)

如果您知道矩阵的魔力,它很容易打印出99%的矩阵模式......而且您可以在不使用任何内存的情况下完成它。

这是代码......

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    if(n == 1)
        cout<<1;
    else
    {
        int sv=2*n-4,a,b;
        a=sv;b=sv+1;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i == j && i+j == n+1)
                {
                    cout<<" 1 ";
                    sv=4;
                 }
                 else
                 {
                    if(i == j)
                        cout<<" "<<a<<" ";
                    else if((i+j) == n+1)
                       cout<<" "<<b<<" ";
                    else
                       cout<<"   ";
                 }
            }
            if(i < n/2+1)
            {
                sv=sv-4;
                a=sv;b=sv+1;
            }
            else if(i > n/2+1)
            {
               sv=sv+4;
               b=sv;a=sv+1;
            }
            else
            {
               sv=4;
               b=sv;a=sv+1;
            }
            cout<<"\n";
        }
   }
}  

答案 1 :(得分:1)

解决这个问题基本上有两种选择:

  1. 逐行和逐列遍历整个矩阵,检查是否必须在当前位置设置某个值
  2. 浏览必须设置特定值的所有位置。
  3. 它们都与for - 循环的条件无关。但是,这是第二种方法的一个例子:

    public class MatrixAdv
    {
        public static void main(String args[])
        {
            //Scanner sc = new Scanner(System.in);
            //System.out.println("Please enter size of element...");
            //int n = sc.nextInt(); // stores size of Matrix
            int n = 9;
    
            int value = 0;// To be incremented everytime to get the Pattern
            int[][] matrix = new int[n][n];
    
            matrix[n/2][n/2] = 1;
            int maxValue = ((n / 2) * 4) + 1; 
            int r = n / 2 - 1;
            int c = n / 2 - 1;
            int d = 2;
            for (value=2; value<=maxValue; value++)
            {
                matrix[r][c] = value;
                int step = ((value-2)%4);
                switch (step)
                {
                    case 0: c+=d; break;
                    case 1: r+=d; c-=d; break;
                    case 2: c+=d; break;
                    case 3: d+=2; r-=d-1; c-=d-1; break;
                }
            }
    
            // Display the value in matrix form
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    if (matrix[i][j] == 0)
                    {
                        System.out.printf("%3s", "_");
                    }
                    else
                    {
                        System.out.printf("%3d", matrix[i][j]);
                    }
                }
                System.out.print("\n");
            }
    
        }
    }