天天看點

試解螺旋矩陣(非方陣)的java實作

通常,我們遇到的螺旋矩陣,都是方陣,即矩陣的行數和列數相等(n * n)。但當遇到非方陣(即行數和列數不相等的矩陣)時,資料其實也是可以實作螺旋排列的。
   通過摸索,試分析如下:
           

1.若需實作資料在矩陣内螺旋排列,則矩陣的行數和列數至少不小于2,即排除行矩陣和列矩陣;

2.取得矩陣行列數後,令生成指定行列的二維數組;

3.通過for循環嵌套,外for循環實作一”圈“資料排列,内for循環實作一圈内四個方向資料指派。外循環的循環次數,與列數有關;

4.因測試發現在3列、5列、7列等奇數列時,易出現最後一個向上方向的資料重複覆寫。故在最後一個内循環加上條件語句,測試是否已經賦過值(這應該是本人在算法上的不到之處,望大俠指導更好的算法);

試貼代碼如下:

import java.util.Scanner;

public class Luoxuan{

public static void main(String[] args) {

int value,row=0,col=0;
	boolean okorno=false;
	
	Scanner input = new Scanner(System.in);
	Pand pd = new Pand();
	
	// 輸入行數,可退出;驗證是否符合
	do {
	
		System.out.println("請輸入螺旋矩陣的行數:");
		value=input.nextInt();
		okorno=pd.hs((int)value);
		if (okorno) { 
			row=value;
			System.out.println("行數有效。");
		}else
			System.out.println("行數不符合,請重新輸入。");
	}while (!okorno);

	
	// 輸入列數,可退出;驗證是否符合
	do {
		System.out.println("請輸入螺旋矩陣的列數:");
		value=input.nextInt();
		okorno=pd.hs((int)value);
		if (okorno) { 
			col=value;
			System.out.println("列數有效。");
		}else
			System.out.println("列數不符合,請重新輸入。");
	}while (!okorno);

	input.close();
	System.out.println("這是行數為 "+row+", 列數為 "+col+"的螺旋矩陣");
	int juzhen[][]=new int[row][col];

	int intA=1,intB;
	if (col%2!=0)
		intB=(col+1)/2;
	else
		intB=col/2;

	for(int i=0;i<intB;i++)
	{
		//左到右循環
		for(int j=i;j<col-i-1;j++){
			juzhen[i][j]=intA;
			intA++;
		}
		

		//上到下循環
		for(int k=i;k<row-i-1;k++){
			juzhen[k][col-i-1]=intA;
			intA++;						
		}

		//右到左循環
		for(int L=col-i-1;L>=i;L--){
			juzhen[row-i-1][L]=intA;
			intA++;						
		}
		
		//下到上循環
		for(int m=row-i-2;m>i;m--){
			if (juzhen[m][i]==0)
				juzhen[m][i]=intA;
			else
				break;
			intA++;						
		}                                    
	}

	//輸出數組,因個位數占位較少,易出現不對齊,故加空格
	for(int i=0;i<row;i++)
	{
		for(int j=0;j<col;j++){
			if (juzhen[i][j]<=9)
				System.out.print(" "+juzhen[i][j]+"  ");
			else
				System.out.print(juzhen[i][j]+"  ");
		}
		System.out.println();
	}
}
           

}

class Pand {

public boolean hs(int value){

if (value>=0)

if (value>=2)

return true;

else

return false;

else

return false;

}

}

(主方法寫得太長了,本身将“輸入及驗證輸入值”、“生成數組”、“輸出數組”放在其他類,但使用input取得輸入值總是報錯。無奈隻得全在主函數實作了。後一個類實在沒什麼意思,還不如改成公有類的一個方法。沒錯,我是初學者。請多包涵。)