print the output below for any n. 
n = 4
????? 1?????? 2?????? 3?????? 4
????? 12????? 13????? 14????? 5
????? 11????? 16????? 15????? 6
????? 10????? 9?????? 8?????? 7
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
n = 6
????? 1?????? 2?????? 3?????? 4?????? 5?????? 6
????? 20????? 21????? 22????? 23????? 24????? 7
????? 19????? 32????? 33????? 34????? 25????? 8
????? 18????? 31????? 36????? 35????? 26????? 9
????? 17????? 30????? 29????? 28????? 27????? 10
????? 16????? 15????? 14????? 13????? 12????? 11
n = 1
????? 1
==========我的想法是建立二维数组,先把最左边一列输出,再把第一行输出,然后判断循环输出...分两种情况:向下向左 和 向上向右,最后把最后一列的多余的符号删除。
问题是编译通过,运行报错。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
        at problem_n.Exp.shuchu(Main.java:23)---》array[j][0] = x;
        at problem_n.Main.main(Main.java:77)---》exp.shuchu(n);package problem_n;
import java.util.Scanner;
/**
 *
 * @author LPX
 */class Exp{    int i,j,k,l,m,n;
    String [][]array;
    public void shuchu(int i)
    {
        String x = "????? ";
        String y = "?????? ";
        array = new String[i-1][i];
        for(j=0;j<=i-1;j++)
            array[j][0] = x;
        for(j=1;j<=i;j++)
            array[0][j] = (j+1)+y;
        int l = j+1;
        for(k=i;k>0;k--)
        {
            if((i/k)%2 == 0)
            {
                for(m=1;m<=k-1;m++,l++)
                    array[m][k] = (l+1)+y;
                for(m=0,n=k-1;m<=k-1;m++,n--,l++)
                    array[k-1][n] = (l+1)+y;
            }
            else if((i/k)%2 == 1)
            {
                for(m=0,n=k-1;m<k-1;m++,n--,l++)
                    array[k-1][n] = (l+1)+y;
                for(m=1;m<=k-1;m++,l++)
                    array[m][k] = (l+1)+y;
            }
        }
        String p = new String();
        String q = y;
        for(m=0;m<i-1;m++)
        {
            p = array[m][i];
            String temp = p.replace(q,"");
            array[m][i] = temp;
        }        for(m=0;m<i-1;m++){
  for(n=0;n<i;n++){
   System.out.printf(array[m][n]);
   }    }    }
}public class Main {    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {        int n;
        Scanner sc = new Scanner(System.in);
        Exp exp = new Exp();
        System.out.println("请输入n的值:");
        n = sc.nextInt();
        exp.shuchu(n);
    }}

解决方案 »

  1.   

    for(j=0;j<=i-1;j++)
    类似这个的小于等于全部换成小于
      

  2.   

    同意一楼的观点 array = new String[i-1][i]; 声明这样的一个数组其中的行列 只能为 0~i-2
    纵列可以为  0~i-1
      

  3.   

    array = new String[i-1][i]; 声明这样的一个数组
      

  4.   

    我换了,但是还是有错。
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
            at problem_n.Exp.shuchu(Main.java:39)---》array[k-1][n] = (l+1)+y;
            at problem_n.Main.main(Main.java:77)---》exp.shuchu(n);
      

  5.   

    去掉?的话,就是螺旋方阵吧。是不是这个意思,第一列是5个?,最后一列没有?,中间固定宽度是7,如果数字宽度小于7后面的就用?补上。如果是这个样子的话:import java.util.*;
    public class ok{
       public static void main(String[] args){
         int n;
         Scanner sc = new Scanner(System.in);
         Exp exp = new Exp();
         System.out.println("请输入n的值:");
         n = sc.nextInt();
         exp.shuchu(n);
       }
    }
    class Exp{
       public void shuchu(int n){
          int[][] array=new int[n][n];
          for(row=0;row<n;++row)
          for(col=0;col<n;++col){
             array[row][col]=0;
          }
          row=0;col=0;row_i=0;col_i=1;
          for(v=1;v<=n*n;++v){
     array[row][col]=v;
     if(col+col_i>n-1||row+row_i>n-1||row+row_i<0||col+col_i<0||array[row+row_i][col+col_i]!=0){
        tmp=row_i;
        row_i=col_i;
        col_i=tmp;
        col_i=-col_i;
     }
     row+=row_i;col+=col_i;
          }
          for(row=0;row<n;++row){
             System.out.print("????? ");
     for(col=0;col<n-1;++col){
     int l=String.valueOf(array[row][col]).length();
     if(l==1) System.out.print(array[row][col]+"?????? ");//如果长度是1,则后面加6个?
     else System.out.print(array[row][col]+"????? ");//如果长度是2,则后面加5个?,以此类推,不知道有没有自动填充的函数
             }
          System.out.println(array[row][col]);
          }
       }
       int row,col,v,row_i,col_i,tmp;
    }
      

  6.   


     if(col+col_i>n-1||row+row_i>n-1||row+row_i<0||col+col_i<0||array[row+row_i][col+col_i]!=0){
            tmp=row_i;
            row_i=col_i;
            col_i=tmp;
            col_i=-col_i;
         }
    这段怎么理解
      

  7.   

    想法是一圈一圈的进行,array数组(除去所有的'?')是一个方阵,从数字1开始一圈一圈由外向内。由array[0][0]=1开始沿第一行向右走,row+=row_i;col+=col_i;此时row_i=0,row值不变,col_i=1,col值一直+1。直到碰到右边界(即array[0][n-1])再+1就会越界(array[0][n]),满足if(col+col_i>n-1)条件,row_i和col_i值互换,col_i=-col_i;
      

  8.   

    array[0][n-1]开始向下走,此时row_i值为1,col_i值为0.即array[1][n-1],array[2][n-1]……,走到array[n-1][n-1],碰到下边界,满足if(row+row_i>n-1)条件,row_i=0,col_i=-1。
      

  9.   

    向左走,array[n-1][n-1],array[n-1][n-2],……,array[n-1][0],满足if(col+col_i<0)条件,此时row_i=-1,col_i=0向上走。当走到array[0][0]=1时,满足if(array[row+row_i][col+col_i]!=0)条件,row_i=0,col_i=1,沿array[1][0],array[1][1]……array[1][n-1],一直螺旋下去。(row_i,col_i)值(0,1),(1,0),(0,-1),(-1,0)循环。