【问题标题】:Reversing Diagonal In Matrix反转矩阵中的对角线
【发布时间】:2014-03-04 02:29:49
【问题描述】:

标题说明了一切,我开发了这种搜索矩阵“矩阵”并从中心到最右上角的对角线方法。我也有从中心到左边的另一组。我现在有一个问题,我将如何让它反转,不是从底部开始,而是从“C”开始,一直到“G”并继续向左移动。

它所要做的就是逆转,但我已经尝试了大约 2 个小时,但仍然无济于事。这实际上是我正在进行的项目的最后一部分,如果有人可以帮助翻转,那就太棒了。

这是代码,为了节省空间,我取出了很大一部分。

public class Word {

    public static int curCol = 10;
    public static int curRow = 10;

    public static String[][] matrix = {{"A","B","C"},
                                       {"D","E","F"},
                                       {"G","H","I"}};

    private static void searchDiagonalCenterToRight(String word) {//Center to bottom Righ    t. Diagnol Works, debug to go along column is needed

        int rowOn = 0;
        int colOn = 0;

        int resetableCol = curCol;
        resetableCol--;//Just resets everything then starts again.

        int decreaser = curCol;//What to decrease by everytime it runs 10,9,8,7 all the way to 1
        int resetableDec = decreaser;
        resetableDec--;

        char c;

        String toFind = word.toUpperCase();

        String developingInverse = "";

        int integer = 0;

        for(int row = 0; row < curRow; row++)//Matrices Row
        {
            for(int i = 0; i <= resetableDec; i++)
            {

                String developingWord = "";

                integer = i;

                for(int j = integer; j <= resetableDec; j++,integer++)
                {              
                    c = matrix[j][integer+row].charAt(0);//Sets to whatever letter it is on
                    char uC = Character.toUpperCase(c);
                    developingWord = developingWord + "" +uC;

                    System.out.println("On Row: " + row + " Started From: " + integer + " Now On: " + j);
                    System.out.println("Processing Letter: " + matrix[j][integer] + " Adding Letter To: " + developingWord);

                }

            }
            resetableDec--;
        }
        System.out.println("\nNo Matching Word Was Found, Center To Left.");
    }

}

【问题讨论】:

  • 我没有得到你想要达到的目标。所以,如果这不是你想要的,请告诉我。先说说我的理解吧。现在您正在访问位置 (0,0) (1,1) (2,2) 等的元素,即对角线元素。并且您想访问 (0,2) (1,2) (2,0) 定位元素。即另一个对角线。这是你想要的吗?
  • 运行你的程序时出现索引超出范围异常
  • 基本上你明白了,索引也来自整数的非调整,因为它在移动列时从 3 变为 2。我所需要的只是从最初的 AEI 然后 BF 然后 C(忽略 A、AE、AEI)到我现在正在尝试的工作,即 CEG 然后 BD 然后 A
  • 我应该说的第一条评论有误 (0,2) (1,1) (2,0)

标签: java loops matrix inverse


【解决方案1】:

这里是代码

public class ReverseDiagonalMatrix {

    public static void main(String[] args) {
        int [][] a = {{ 1, 2, 3, 4},
                      { 5, 6, 7, 8},
                      { 9,10,11,12},
                      {13,14,15,16}};
        int a1[][]= {{1,2,3},
                     {4,5,6},
                     {7,8,9}};
        int a2[][]= {{1,2},
                     {3,4}};
        int [][] a3 = {{ 1, 2, 3, 4, 5},
                       { 6, 7, 8, 9,10},
                       {11,12,13,14,15},
                       {16,17,18,19,20},
                       {21,22,23,24,25}};
        System.out.println("==========5x5==============");
        findReverseDiagonalOrder(a3);
        System.out.println("==========4x4==============");
        findReverseDiagonalOrder(a);
        System.out.println("===========3x3=============");
        findReverseDiagonalOrder(a1);
        System.out.println("===========2x2=============");
        findReverseDiagonalOrder(a2);
    }

    public static void findReverseDiagonalOrder(int[][] a) {
        int m = a.length;

        int row=0;
        int col = m-1;

        for(int i=0;i<m*m;i++) {
            System.out.println(a[row][col]);
            if(col==m-1) {
                if(row==0)
                    col--;
                else {
                    col= (row==col)? 0:col-(row+1);
                    row= (row==m-1)? 1:0;
                }
            }
            else if(row==m-1) {
                if(col-1==0 && col>0)
                col--;
                else {
                    row = m-col;
                    col=0;
                }

            }
            else {
                row++;
                col++;
            }
        }
    }    
}

【讨论】:

    【解决方案2】:

    要访问另一个对角线,只需使用以下循环

    for(int i=0;i<n;i++){
          for(int j=0;j<n;j++){
                   if(i==(n-j-1)){
                         //Do something
                   }
           }
     }
    

    通过使用此逻辑,您将获得 CEG

    添加相同的逻辑来构造其他字符串。

    编辑:-

    像这样改变循环

    for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(i<=(n-j-1)){
                    System.out.println("("+i+","+j+")");
                }
            }
        }
    

    您可以访问元素 (0,0) (0,1) (0,2) (1,0) (1,1) (2,0)。我希望这是你想要的。

    【讨论】:

    • 嘿,这里有一个从中心到右的实际对角线方法更好的例子。 pastebin.com/p7M7mZBp 不太确定我是否理解您发布的内容,但您似乎有正确的想法。无论如何,感谢您迄今为止的帮助。
    • 总是乐于提供帮助:-)
    猜你喜欢
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多