题目信息:
解题思路:
解题思路,同蛇形填数问题,所以不再重点叙述。
代码实现:
package 分治法;
import java.util.Scanner;
/*
* Dragon 2017/3/27
* 算法设计与分析:P57
* 本题的思路:根据数字的特点,将整个方阵分为四部分,每一部分i,j的移动不同,因此给赋值
* 划分区间,再一层一层地解决问题
* 易错点:数组的下标问题,循环结束的问题
* 一种比较好的循环思维:将要赋值的数组与循环的次数(随便找一个变量来解决)分开,不容易产生混乱!!!
*/
public class 数字旋转 {
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
System.out.println("您想打印几阶方阵?");
int n=in.nextInt();
PrintTwoArray(NumberCircle(n));
}
public static int[][] NumberCircle(int n)
{
int[][] numbers=new int[n][n];
int size=n;
int number=1;
int begin=0;
int i=0,j=0;
while(size!=1 && size!=0)
{
i=begin;j=begin;
for(int k=0;k<size-1;k++)
{
numbers[i][j]=number;
number++;i++;
}
for(int k=0;k<size-1;k++)
{
numbers[i][j]=number;
number++;j++;
}
for(int k=0;k<size-1;k++)
{
numbers[i][j]=number;
number++;i--;
}
for(int k=0;k<size-1;k++)
{
numbers[i][j]=number;
number++;j--;
}
size=size-2;begin=begin+1;
}
if(size==1)
numbers[begin][begin]=number;
return numbers;
}
//打印二维数组
public static void PrintTwoArray(int[][] numbers)
{
int row=numbers.length;
int cow=numbers[0].length;
for(int i=0;i<row;i++)
{
for(int j=0;j<cow;j++)
System.out.printf("%-4d",numbers[i][j]);
System.out.println();
}
}
}