タイトル:順次時計回り順に外側から内側に向かって順に、行列を入力し、各番号をプリントアウト。例えば、次のように入力行列である場合:
1,2,3,4
5,6,7,8
9,10,11,12
13,14,15,16
そして、デジタル1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10を印刷]をクリックします。
それは順次、内側リングに順次外側から印刷されているので、図に示すように、マトリックスは、我々は、いくつかのターンを想像することができます。私たちは、それぞれが円行列を印刷、行列を印刷するためにループを使用することができます。
次に、周期分析条件の終了、左上隅の座標は最初のラップ(0,0)の印刷、行列の行の行の数が列の数が列であると仮定すると、左上隅の座標は、第二のリング(1 1)など。私たちは、標準ラベル行と列の左上隅の座標は常に同じであることに注意してください。 その後、行列の左上隅が我々の分析の目標として(開始、開始)ラップで選択することができます。場合、N×N行列、大部分が円形(STARTX、startYと)は、最大の行の長さがある(startYと-1)* 2つの要素、(STARTX-1)*各列の2つの要素、行程度の最大> startYと* 2と列> startxと* 2。
次に、我々は機能、すなわちどのようPrintMatrixInCircleを達成するための円を印刷する方法を検討してください。私たちは4つのステップに分け円で印刷することができます右の印刷を行うには1行から最初のステップは、上から下に第二段階の行を印刷し、第三のステップ右から左に線を印刷し、下から4番目のステップは、1つを出力します。我々は、ループまたはラインを使用することができ、各ステップは、開始座標に応じてプリントアウトされます。しかし、それは最終ラップのみ、またはだけでも数が一つだけの行に退化してもよく、ことは注目に値するので、この円の意志が不要になった4つの手順を印刷します。
因此我们要仔细分析打印时的每一步的前提条件。第一步总是需要的,因为打印一圈至少需要一步。如果只有一行,那么就不用第二步了。也就是需要第二步的前提条件是终止号大于起止号。需要第三步打印的前提条件是圈内至少有两行两列,也就是说除了要求终止行号大于起始行号之外,还要求终止列号大于起始列号。同理,需要打印第四步的前提条件是至少有三行两列,因此要求终止行号比其实行号至少大2,同时终止列号大于起始列号。
public void printMatrixInCircle(int[][] array){
if(array == null)
return;
int start = 0;
while(array[0].length > start*2 && array.length >start*2){
printOneCircle(array,start);
start++;
}
}
private void printOneCircle(int[][] array,int start){
int columns = array[0].length;
int rows = array.length;
int endX = columns - 1 - start;
int endY = rows - 1 - start;
//从左到右打印一行
for(int i = start;i <= endX ;i++){
int number = array[start][i];
System.out.print(number+",");
}
//从上到下打印一列
if(start <endY){
for(int i = start +1;i<=endY;i++){
int number = array[i][endX];
System.out.print(number+",");
}
}
//从右到左打印一行
if(start < endX && start < endY){
for(int i = endX -1;i>=start;i--){
int number = array[endY][i];
System.out.print(number+",");
}
}
//从下到上打印一列
if(start <endY && start <endY -1){
for(int i =endY -1;i>=start+1;i--){
int number = array[i][start];
System.out.print(number+",");
}
}
}