黑马程序员技术交流社区

标题: 求解??? [打印本页]

作者: 张昶    时间: 2013-4-18 23:06
标题: 求解???
本帖最后由 张昶 于 2013-4-19 23:25 编辑

从键盘输入一个整数(1~20)
则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
例如:
输入数字2,则程序输出:
1 2
4 3
输入数字3,则程序输出:
1 2 3
8 9 4
7 6 5
输入数字4, 则程序输出:
1  2   3   4
12  13  14  5
11  16  15  6
10   9  8   7
作者: zhuiyi0819    时间: 2013-4-18 23:28
import java.util.*;
/*从键盘输入一个整数(1~20)
*则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
*/

public class DemoNum {
        int number=1;
        int a[][]=new int[20][20];
        public void doit(int m,int i1,int i2)
        {
                if(m<0) return;
                if(m==1)
                        a[i1][i2]=number;
                else
                {
                for(int i=0;i<m;i++)//top
                        a[i1][i2+i]=number++;
                for(int i=0;i<m-1;i++)//right
                        a[i+i1+1][m+i2-1]=number++;
                for(int i=0;i<m-1;i++)//bottom
                        a[m+i1-1][m+i2-2-i]=number++;
                for(int i=0;i<m-2;i++)//left
                        a[m+i1-i-2][i2]=number++;
                }
                doit(m-2,i1+1,i2+1);
        }
        public void print(int m)
        {
                for(int i=0;i<m;i++)
                {
                        for(int j=0;j<m;j++)
                        {
                                System.out.print(a[i][j]+" ");
                        }
                        System.out.println();
                }
        }
        public static void main(String[] args){
                System.out.println("输入数字(1-20):");
                Scanner input=new Scanner(System.in);
                int  num=input.nextInt();
                DemoNum dn=new DemoNum();
                dn.doit(num,0,0);
                dn.print(num);
        }
}
作者: love_java    时间: 2013-4-18 23:32
这个有点意思。。。

作者: 〃Mr.Zぐ    时间: 2013-4-19 12:44
public class Test9 {
  public static void main(String[] args){
   //定义数组的长度
   
    int len = 10;
   
    //调用得到螺旋数组的方法
   
   int[][] arys = getSpiralArray(len);
   
    //用for循环嵌套,对数组进行遍历输出
   
    for (int i = 0; i < len; i++)
     {
      for (int j = 0; j < len; j++)
      {  
   
       System.out.print(arys[i][j] + "\t");
      }
        System.out.println();
    }
  }

public static int[][] getSpiralArray(int length) {
  //定义一个等长度的数组
  
  int[][] array = new int[length][length];
  
  int upcol = 0;
  
  //向右走列数
  
  int leftRow = 0;
  
  //记录最后一行的变量
  
  int downCol = length-1;
  
  //记录最后一列的变量
  
  int rightRow = length-1;
  
  int num = 1;
  while(length > 0){
   
   //向右走,循环遍历,并把得到的值添加到数组中
   
   for(int i = 0, temp = leftRow; i < length; i++){
   
    //第一行,打印向右走,随着列数的的自增1,第一行的元素也随着自增1
   
    array[upcol][temp++] = num++;      
   }     
   //向下走,循环遍历,并把得到的值添加到数组中
   
   for(int i = 0, temp =  leftRow+1; i < length-1; i++){
   
    //最后一列,打印向下走,随着行数的自增1,最后一列的元素也自增1
   
    array[temp++][downCol] = num++;
   }
   
   //向左走 ,循环遍历,并把得到的值添加到数组中,是从length-1列的最后一个元素开始,所以是rightRow-1
   
   for(int i = 0, temp = rightRow-1; i < length-1; i++){
   
    //最后一行,打印向左走,随着列数的自减1,最底层的元素自增1
   
    array[downCol][temp--] = num++;
   }   
   //向上走,循环遍历,并把得到的值添加到数组中  ,是从length-1行的最后一个元素开始,所以是downCol-1
   
   for(int i = 0, temp =downCol-1; i< length-2; i++){
   
    //最左边一列,向上打印,随着行数的自减1,最左边的一列中的元素自增1
   
    array[temp--][upcol] = num++;
   }
   //再往里边依次循环,直到打印到最后的一个数就是length的平方
   
   //每打印最外面的一圈,内圈的长度减少2
   
   length = length - 2;
   
   //向右走的行数增加1,也就是说第二轮循环是从第二行、第二列、length-1行、length-1列
   upcol++;
   leftRow++;
   downCol--;
   rightRow--;
  }  
  return array;
}  

}
作者: 张昶    时间: 2013-4-19 23:25
zhuiyi0819 发表于 2013-4-18 23:28
import java.util.*;
/*从键盘输入一个整数(1~20)
*则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺 ...

谢谢!很好!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2