- /*
- 第四题:
- 输出 n=5 的螺旋方阵
- 1 2 3 4 5
- 16 17 18 19 6
- 15 24 25 20 7
- 14 23 22 21 8
- 13 12 11 10 9
-
- 思路:
- 打印这一组数首先想到的是一行一行打印,但是很麻烦
- 然后我们可以考虑到用二维数组吧数字装起来打印
- arr{{1,2,3,4,5},{16,17,18,19,6},{15,24,25,20,7},{14,23,22,21,8},{13,12,11,10,9}}
- 这样就是基本上解决这个问题了,数据存入有很多方法
- 我使用的是固定角标 一层一层向内输出
- 但是我的方法有一个弊端奇数时中心的最后打印不出
- */
- import java.util.Scanner;
- class Day04_04
- {
- public static void main(String[] args){
- Scanner s = new Scanner (System.in);
- while(true){
- System.out.println("请输入一个正整数:");
- int x = s.nextInt();
- Alg(x);
- }
- }
- public static void Alg(int n){
- int arr[][]=new int[n][n]; //定义一个数组用于储存
- for (int x=0,y=0,i=1,kx=0,ky=0;i<n*n;kx++,ky++){ //x,y分别用于做二维数组 的X,变量和y变量,i为当前二位数组的值,
- //kx,ky分别代表着x的增量和y的增量,作用为循环向内移动一层
- //这里是数据从左往右移动,X不变Y变,kx和ky在此处分别给x,y赋值
- //表示数组角标向内一层,y<n-1-ky,是把y的可循环的值向内减一
- //该循环打印的值是 1、2、3、4 ,17、18
- for (x=kx,y=ky;y<n-1-ky;y++,i++){
- arr[x][y]=i;//x=0;y=4
- }
- //这里是数据从上往下移动,Y不变X变,x,y刚好可以沿用上一次的值
- //表示数组角标向内一层,x<n-1-ky,是把x的可循环的值向内减一
- //该循环打印的值是5、6、7、8, 19、20
- for (;x<n-1-kx;x++,i++){
- arr[x][y]=i;//x=4;y=4
- }
- //这里是数据从右往左移动,X不变Y变,x,y刚好可以沿用上一次的值
- //表示数组角标向内一层,y>0+ky,是把y的可循环的值向内减一
- //该循环打印的值是 9\1\0\11\12,21\22
- for (;y>0+ky;y--,i++){
- arr[x][y]=i;//x=4;y=0
- }
- //这里是数据从下往上移动,Y不变X变,x,y刚好可以沿用上一次的值
- //表示数组角标向内一层,x>0+kx,是把x的可循环的值向内减一
- //打印的值分别是13\14\15\16,23,24
- for (;x>0+kx;x--,i++){
- arr[x][y]=i;//y=0;x=0
- }
-
- }
- //然后我们会发现当我们输入奇数的时候最后一个值打印不出求各位大神打救
- //这个就是把最后一个值打印出来的判断
- if(n%2!=0){
- int m=(n-1)/2;
- arr[m][m]=n*n;
- }
- // 遍历数组,打印
- for (int i=0;i<n ;i++ )
- {
- for (int j=0;j<n ;j++ )
- {
- System.out.print(arr[i][j]+"\t");
- }
- System.out.println();
- }
- }
- }
复制代码
|