通常,我們遇到的螺旋矩陣,都是方陣,即矩陣的行數和列數相等(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取得輸入值總是報錯。無奈隻得全在主函數實作了。後一個類實在沒什麼意思,還不如改成公有類的一個方法。沒錯,我是初學者。請多包涵。)