根据行号,打印图案
输入5:
打印如下
1   2   3   4   5
12  13  14  6
11  15  7
10  8
9
输入8:
打印如下:
1   2   3   4   5   6   7   8
21 22   23  24  25  26  9
20 33   34  35  27  10
19 32   36  28  11
18 31   29  12
17 30   13
16 14
15  
求高手指教

解决方案 »

  1.   

    写了个,算法不优,但是应该没啥问题。package org;import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    public class Test { public static void main(String args[]) throws Exception {
    Scanner scan = new Scanner(System.in);
    int in = scan.nextInt();
    List<Integer[]> list = new ArrayList<Integer[]>();
    for(int i = in; i > 0; i--){
    list.add(new Integer[i]);
    }
    int c = 1;
    int index = 1;
    int nextArray = 0;
    boolean notAllFull = false;
    while(true){
    for(Integer[] all : list){
    for(Integer itg : all){
    if(itg == null || itg == 0){
    notAllFull = true;
    }
    }
    }
    if(!notAllFull){
    break;
    }else{
    notAllFull = false;
    }
    Integer[] is = list.get(nextArray);
    if(nextArray == 0){
    for(int i = 0; i < is.length; i++){
    is[i] = c++;
    }
    nextArray++;
    continue;
    }else{
    if(index%2!=0){
    for(int i = is.length - 1; i >= 0; i--){
    if(is[i] == null || is[i] == 0){
    is[i] = c++;
    break;
    }
    }
    //等于最大长度的时候
    boolean isFull = true;
    if(nextArray == list.size()-1){
    nextArray--;
    index++;
    }else{
    Integer[] next = list.get(nextArray+1);
    for(Integer it : next){
    if(it == null || it == 0){
    isFull = false;
    break;
    }
    }
    if(isFull){
    nextArray--;
    }else{
    nextArray++;
    }
    }
    }else{
    for(int i = 0 ; i < is.length; i++){
    if(is[i] == null || is[i] == 0){
    is[i] = c++;
    break;
    }
    }
    boolean isFull = true;
    if(nextArray != 0){
    Integer[] next = list.get(nextArray-1);
    for(Integer it : next){
    if(it == null || it == 0){
    isFull = false;
    break;
    }
    }
    if(isFull){
    Integer[] it = list.get(nextArray);
    for(int i = 0; i < it.length; i++){
    if(it[i] == null || it[i] == 0){
    it[i] = c++;
    }
    }
    index++;
    nextArray++;
    }else{
    nextArray--;
    }
    }
    }
    }
    }
    for(Integer[] all : list){
    for(Integer i : all){
    System.out.print(i + " ");
    }
    System.out.println();
    }
    }
    }
      

  2.   


    public class TestDemo {
    static int count = 1;
    /** * @param args */
    public static void main(String[] args) {
    int a[][] = new int[20][20];
    int number = 10;
    int gride = 0;
    // danyuan(a,number,gride);
    while(number >= 1){
    danyuan(a,number,gride);
    gride+=1;
    number -= 3;
    }
    for(int i=0;i<a.length;i++){
    for(int j=0;j<a.length;j++){
    System.out.print(a[i][j]==0?"\t":a[i][j] + "\t");
    }
    System.out.println();
    }
    }
    public static void danyuan(int a[][],int number,int gride){
    for(int i=0;i<number-1;i++){
    a[gride][gride+i]=count++;
    }
    for(int i=0;i<number;i++){
    a[gride + i][number-(i-gride)-1]=count++;
    }
    for(int i=number-2;i>0;i--){
    a[gride + i][gride]=count++;
    }
    }
    }
      

  3.   

    package csdn;public class Print {
    /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
      new Print().doPrint(10);
    }
    /**
     * 答应算法
    1 2 3 4 5 6 7 8
    21 22 23 24 25 26 9
    20 33 34 35 27 10
    19 32 36 28 11
    18 31 29 12
    17 30 13
    16 14
    15 
     */
    public void doPrint(int num){
    for(int i=1;i<=num;i++){
    for(int j=1;j<=num+1-i;j++){
    doDarw(i,j,num);
    }
    System.out.println();
    }
    }
    /**
     * @param i 表示行数
     * @param j 表示每行第几个数
     */
    public void doDarw(int i,int j,int num){
     //i-1>0比如第二行说
     //开始部分
     if(i-1>0&j<i&j<=(num-i+1)/2){
     int number=doCount(num,j*3)+j+1-i;
     System.out.print(number+" ");
     }
     //每次第加一个数,从i个数开始递加,递加到(num-i)
     //中间部分
     else if(j>=i&j<=num-2*(i-1)){
     int number=doCount(num,(i-1)*3)+j+1-i;
     System.out.print(number+" ");
     }
     //结尾部分
     else {
     int number=doCount(num,((num-i-j+1)*3)+1)+i-(num-i-j+2);
     System.out.print(number+" ");
     }   
     }/**
     * @param begin 起始值
     * @param cicle 圈数
     * @return返回叠加数
     */
    public int doCount(int begin,int cicle){
    int sum=0;
    for(int i=0;i<cicle;i++){
    sum+=begin-i;
    }
    return sum;
    }
    }1 2 3 4 5 6 7 8 9 10 
    27 28 29 30 31 32 33 34 11 
    26 45 46 47 48 49 35 12 
    25 44 54 55 50 36 13 
    24 43 53 51 37 14 
    23 42 52 38 15 
    22 41 39 16 
    21 40 17 
    20 18 
    19