題目:
計算並輸出 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();
}