蛇形矩陣的java實現

題目:

計算並輸出 nXn 的蛇形矩陣。(n>0)
例如 4X4 的蛇形矩陣如下:
1   3   4  10
2   5   9  11
6   8  12  15
7  13  14  16

 

類似於前面的輸出螺旋矩陣的方法,每一次在數組中填寫新的數字都有一個方向,與輸出螺旋數組不同的是不是簡單的上下左右四個方向,這裏涉及到右,下,右上,左下四個方向,針對每步操作都需要想好對應的處理方法,如:

1)向右上位置填寫元素的時候可能會碰到行<0或者是列>=N,如果行小於0,那麼接下來就需要向右填寫元素,列大於等於N,那麼很明顯接下來就要向下填寫元素。

2)向下添加元素時,也會碰到一些情況,例如行>=N了,表示添加到最後一行了,此時需要向右移動,另外在第一列和最後一列向下添加元素情況也不一樣,在第一列向下添加元素後,接下來應該向右上添加元素,在最後一列向下添加元素後接下來應該向左下添加元素。

向左下和向右填寫元素與這類似。

參加下面的代碼(代碼來自於http://blog.csdn.net/Mailbomb/archive/2008/07/05/2613736.aspx

 

public static void main(String[] args) {
		/**2、計算並輸出nXn的蛇形矩陣。(n>0)
		* 例如4X4的蛇形矩陣如下:
		* 1  3  4 10
                                  * 2  5  9 11
                                  * 6  8 12 15
                                  * 7 13 14 16
		 */ 
		//DOWN UPRIGHT RIGHT LEFTDOWN
		int n=5;
		int[][] data = new int[n][n];
		int dire; //當前數字的移動方向
		final int UPRIGHT = 0; //上右
		final int DOWN = 1; // 下
		final int LEFTDOWN= 2; //左下
		final int RIGHT = 3;// 右
		dire = DOWN;
		int value = 1; //數組元素的值
		int row = 0; //第一維下標
		int col = 0; //第二維下標
		data[0][0] = 1; //初始化第一個元素 
		data[n-1][n-1] = n*n;
		while(value < n * n-1){
			System.out.print("("+dire+")");
			switch(dire){
				case DOWN://DOWN -UPRIGHT +RIGHT -LEFTDOWN
					row++; //移動到下一行
					if(row>=n){ //超過邊界
						row--; //後退
						dire = RIGHT;
						continue; //跳過該次循環
					}
					else 
					{
						value++; //數值增加1
						data[row][col] = value;//賦值
						if(col==0) { 
							dire = UPRIGHT; 
						}
						else if(col==n-1){ 
							dire = LEFTDOWN; 
						}
					} 
					break;
				case UPRIGHT://+DOWN -UPRIGHT +RIGHT LEFTDOWN
					row--;
					col++; //移動到上一行,右一列
					if(col>=n)//超過邊界
					{
						row++;
						col--; //後退
						dire = DOWN;
						continue; //跳過該次循環
					}
					else if(row<0){ //超過邊界
						row++;
						col--; //後退
						dire = RIGHT; 
						continue; //跳過該次循環 
					} else {
						value++; //數值增加1
						data[row][col] = value;//賦值
						dire = UPRIGHT;
					}
					break;
				case RIGHT://+DOWN -UPRIGHT RIGHT -LEFTDOWN
					col++; //移動到右一列
					if(col>=n){ 
						col--; //後退
						dire = DOWN;
						continue; //跳過該次循環
					}
					else {
						value++; //數值增加1
						data[row][col] = value;//賦值
						if(row==0) { 
							dire = LEFTDOWN; 
						}
						else if(row==n-1){ 
							dire = UPRIGHT; 
						}
					}
					break;
				case LEFTDOWN://+DOWN UPRIGHT +RIGHT -LEFTDOWN
					row++;
					col--; //移動到下一行,左一列
					if(row>=n) { //超過邊界
						row--;col++; //後退
						dire = RIGHT;
						continue; //跳過該次循環
					}else if(col<0)//超過邊界
					{
						row--;col++; //後退
						dire = DOWN;
						continue; //跳過該次循環
					}
					else {
						value++; //數值增加1
						data[row][col] = value;//賦值
						dire = LEFTDOWN;
					}
					break;
			}
		}
		System.out.println();
		//輸出數組中的元素
		for(int i = 0;i < data.length;i++){
			for(int j = 0;j < data[i].length;j++){
				if(data[i][j] < 10){//右對齊
					System.out.print(' ');
				}
				System.out.print(data[i][j]);
				System.out.print(' ');
		    }
		   System.out.println();
		}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章