模式组成的数字顺时针方向围绕一个矩形形状(每次减少长度和宽度)

我已经为许多模式编写了代码,但是无法为此编写…..甚至没有任何提示如何继续。

我想生成以下输出:

1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 

…将矩形的宽度和高度指定为输入。

我会这样做:

将5×5二维整数数组初始化为0.具有direction变量,并为四个方向定义常量或enum 。 从(0,0)开始向右移动,用增加的值填充数组,直到你到达边缘或不是0的数字。然后,增加方向(并换行)并继续。 然后按行打印数组。

使用循环的另一种方法是迭代所有(x,y)坐标,并将x和y传递给一个函数,该函数为您提供该位置的值。 我编写的函数与填充数组的函数完全相同,除了它不写入数组,当它到达给定的(x,y)时,它返回当前值。 不是很有效,但它实现了结果。

由于这是一个家庭作业问题,我只是给你一个提示 – 从编写这个函数开始:

 void predecessor(int in_x, int in_y, int& out_x, int& out_y); 

我不会再说了 – 由你决定这个function是什么:)

我会创建4个独立的循环。

循环1将创建1 2 3 4 5
循环2将创建6 7 8 9
循环3将创建10 11 12 13
循环4将创建14 15 16

完成后,你已经填充了正方形的外部,并留下了一个较小的3×3正方形内部,可以完全相同的方式填充,具有完全相同的4个循环。

我不得不自己想出这个,代码是逆时针的,但你可以通过改变方向数组来改变它。

 int x = 0; int y = 0; int c = width * height; int directions[4] = { 0, 1, 0, -1}; int distances[2] = { height, width-1}; int di = 0; int dx = directions[ di]; int dy = directions[ di+1]; int dis = distances[ di]; for( int i=0; i 
 #include  #include  #define SIZE 5 #define RIGHT 1 #define DOWN 2 #define LEFT 3 #define UP 4 void printArray1(int b[SIZE][SIZE], int size); void printArray2(int b[SIZE][SIZE], int size); int move(int b[SIZE][SIZE], int *xpos, int *ypos, int *movem, int number); int main(void) { int i, j, num; int dir; int a[SIZE][SIZE] = { 0 }; printArray1(a, SIZE); printf("\n\n"); printArray2(a, SIZE); dir = RIGHT; i = 0; j = 0; num = 1; for (; num <= (SIZE * SIZE); num++ ) move(a, &i, &j, &dir, num); printArray1(a, SIZE); printf("\n\n"); printArray2(a, SIZE); return 0; } void printArray1 (int b[SIZE][SIZE], int size) { int i, j; for ( i = 0; i < size; i++ ) { for ( j = 0; j < size; j++ ) printf("%3d ", b[j][i]); printf("\n"); } printf("\n\n"); return; } void printArray2 (int b[SIZE][SIZE], int size) { int i, j; for ( i = 0; i < size; i++ ) { for ( j = 0; j < size; j++ ) printf("%3d ", b[i][j]); printf("\n"); } printf("\n\n"); return; } int move(int b[SIZE][SIZE], int *xpos, int *ypos, int *movem, int number) { int x, y, dirn, reqdDirn; x = *xpos; y = *ypos; dirn = *movem; if (b[x][y] == 0 ) { b[x][y] = number; } reqdDirn = dirn; switch (dirn) { default: printf("Unexpected value"); return; case RIGHT: x = x + 1; if (b[x][y] == 0) { if (x > SIZE-1) { reqdDirn = DOWN; x = SIZE - 1; y = y + 1; if (y > SIZE-1) y = SIZE - 1; } } else { // just step back and change direction x = x - 1; y = y + 1; reqdDirn = DOWN; } break; case DOWN: y = y + 1; if (b[x][y] == 0) { if (y > SIZE-1) { reqdDirn = LEFT; y = SIZE - 1; x = x - 1; if (x < 0) x = 0; } } else { y = y - 1; x = x - 1; reqdDirn = LEFT; } break; case LEFT: x = x - 1; if (b[x][y] == 0) { if (x < 0) { reqdDirn = UP; x = 0; y = y - 1; if (y < 0) y = 0; } } else { // just step back and change direction x = x + 1; y = y - 1; reqdDirn = UP; } break; case UP: y = y - 1; if (b[x][y] == 0) { if (y < 0) { reqdDirn = RIGHT; y = 0; x = x + 1; if (x > SIZE-1) x = SIZE - 1; } } else { // just step back and change direction y = y + 1; x = x + 1; reqdDirn = RIGHT; } break; } *xpos = x; *ypos = y; *movem = reqdDirn; } Output 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 1 16 15 14 13 2 17 24 23 12 3 18 25 22 11 4 19 20 21 10 5 6 7 8 9 

//在java中
包ds1;

 public class SpiralMatrix { public static void main(String[] args) throws Exception{ int[][] values = {{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}}; int x=0,y=0,z=0 ,length=values.length; System.out.println("Jai ShRaam \n array size :"+length+" \n \n"); //Logic Starts for (int i=0;i=i;k--) { System.out.print(values[length-x][k]+" - "); } for(int k=i+length-y;k>=x;k--) { System.out.print(values[k][i]+" : "); } }//end of i==j }//end of j loop //System.out.println(); } //Logic ends }//end of psvm } 

//答案1,2,3,4,5,10; 15; 20; 25; 24 – 23 – 22 – 21 – 16:11:6:7,8,9,14; 19; 18 – 17 – 12:13,

 public ArrayList spiralOrder(final List> a) { ArrayList result = new ArrayList(); int m = a.get(0).size(); int n = a.size(); if(m>1 && n>1){ int loopCounter = (n > m) ? m*2 : n *2 -1 ; int opr=1; int i=0,j=0; int opA=m,opB=n,opC=0,opD=1; for(int k=0;k < loopCounter ;k++){ if(opr == 1){ int counter =0; while(counter < opA){ System.out.print(a.get(i).get(j)+ ";"); result.add(a.get(i).get(j)); counter++; if(j != opA-1){ j++; } else{ break; } } opr =2; continue; } if(opr == 2){ i++; int counter =1; while(counter < opB){ System.out.print(a.get(i).get(j)+ ";"); result.add(a.get(i).get(j)); counter++; if( i != opB-1){ i++; } else{ break; } } opr =3; continue; } if(opr == 3){ j--; int counter =j; while(counter >= opC){ System.out.print(a.get(i).get(j)+ ";"); result.add(a.get(i).get(j)); counter --; if(j != opC){ j--; } else{ break; } } opr =4; continue; } if(opr == 4){ i--; int counter = i; while(counter >= opD){ System.out.print(a.get(i).get(j)+ ";"); result.add(a.get(i).get(j)); counter --; if(i != opD){ i--; }else{ break; } } opr =1; j++; opA = opA -1; opB = opB -1; opC= opC +1; opD = opD+1; continue; } } } else if(n ==1){ for(int k=0;k < a.get(0).size();k++){ result.add(a.get(0).get(k)); } } // Populate result; return result; } 

这是我在Java中的解决方案:(我已经知道指针指向内存上的特定地址或声明在C上实现此目的,并且因为Java不支持指针我使用非C指针逻辑执行此操作)所以,那就是说,我用指向矩阵“地址”(rown,column)的逻辑做了这个。

 static void MatrixTravelPointer(int [][] m){ int pointerX = 0; int pointerY = 0; List elements = new ArrayList<>(); int maxlength_ = 0; int pos = 0; for(int i=0;i 1 && turn == true && pointerX == turns - 1){ turn = false; } if(turn == false){ if(pointerY < m[0].length - turns){ pointerY++; } else if(pointerX < m.length - turns){ pointerX++; } } if(turn == true) { if(pointerY >= turns - 1){ pointerY--; } else if(pointerX >= turns - 1){ pointerX--; } } pos++; } System.out.print("\n"); Iterator it = elements.iterator(); while(it.hasNext()){ System.out.print(" "+(int)it.next()); } } 

目前我的逻辑仅适用于立方矩阵和矩形矩阵。
逻辑是这样使用4×4矩阵:
指针从[0] [0]到[0] [3]在矩阵中传播,此时它将行程指针从[0] [3]变为[3] [3],想象一个自上而下“ L“在俄罗斯方块上,此时我们可以省略或删除顶行和右列,并使用 – 从下到上反转从右到左的行程点。 因为每当我们在“第二回合”上形成“L”时,我们需要根据我们形成“L”的时间减少行程大小(“L”大小)和“turn”变量。

 package arrays; public class SpiralPrinting { public static void main(String[] args) { // TODO Auto-generated method stub int[][] a = new int[][] { { 1, 2, 3 }, { 5, 6, 7 }, { 9, 10, 11 }, { 13, 14, 15 } }; int cols = a[0].length; int rows = a.length; Business1 b = new Business1(); b.print(a, rows, cols); } } class Business1 { int i = 0; int j = 0; int count = 0; public void print(int[][] a, int row, int col) { int max = row * col; while (count < max) { for (int k = 0; k < col; k++) { System.out.println(a[i][j]); j++; count++; } row--; j--; i++; for (int k = 0; k < row; k++) { System.out.println(a[i][j]); i++; count++; } i--; j--; col--; for (int k = 0; k < col; k++) { System.out.println(a[i][j]); j--; count++; } row--; j++; i--; for (int k = 0; k < row; k++) { System.out.println(a[i][j]); i--; count++; } i++; j++; col--; } } }