`
conray
  • 浏览: 41057 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

源于作者:jenlp110 的 一道面试题

阅读更多
作者文章来源:http://www.iteye.com/topic/545378

一个画图程序 要求打印出 :
int i=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  
  
int i=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 



解决方法一:
class snakePrint {   
    static int length = 7;   
    static int value = 1;   
    static int[][] snake = new int[length][length];   
    static Direction lastDirection = Direction.Right;   
  
    static enum Direction {   
        Right, Down, Left, Up;   
    }   
  
    public static void initialArray() {   
        int row = 0, line = 0;   
        for (int c = 0; c < length * length; c++) {   
            snake[row][line] = value;   
            lastDirection = findDirection(row, line);   
            switch (lastDirection) {   
                case Right:   
                    line++;   
                    break;   
                case Down:   
                    row++;   
                    break;   
                case Left:   
                    line--;   
                    break;   
                case Up:   
                    row--;   
                    break;   
                default:   
                    System.out.println("error");   
            }   
            value++;   
        }   
    }   
  
    static Direction findDirection(int row, int line) {   
        Direction direction = lastDirection;   
        switch (direction) {   
            case Right: {   
                if ((line == length - 1) || (snake[row][line + 1] != 0))   
                    direction = direction.Down;   
                break;   
            }   
            case Down: {   
                if ((row == length - 1) || (snake[row + 1][line] != 0))   
                    direction = direction.Left;   
                break;   
            }   
            case Left: {   
                if ((line == 0) || (snake[row][line - 1] != 0))   
                    direction = direction.Up;   
                break;   
            }   
            case Up: {   
                if (snake[row - 1][line] != 0)   
                    direction = direction.Right;   
                break;   
            }   
        }   
        return direction;   
    }   
  
    public static void main(String[] args) {   
        initialArray();   
  
        // display.....   
        for (int i = 0; i < length; i++) {   
            for (int j = 0; j < length; j++) {   
                System.out.print(snake[i][j] + "  ");   
            }   
            System.out.println();   
        }   
    }   
}  

解决方法二:
public static void main(String args[]){   
      int N=5;   
      int a[][]=new int[N][N];   
      int i=0,j=0;   
      int count=1;   
      for(i=0;i<N;i++){   
          for(j=0;j<N;j++){   
              a[i][j]=0;   
          }   
      }   
      i=0;   
      j=0;   
      for(int k=0;k<=N/2;k++){   
          i=k;   
          j=k;   
          for(i=k;i<N-k;i++){   
              a[j][i]=count;   
              count++;   
          }   
          i=N-k-1;   
          for(j=k+1;j<N-k;j++){   
              a[j][i]=count;   
              count++;   
          }   
          j=N-k-1;   
          for(i=N-k-2;i>=k;i--){   
              a[j][i]=count;   
              count++;   
          }   
          i=k;   
          for(j=N-k-2;j>=1+k;j--){   
              a[j][i]=count;   
              count++;   
          }   
      }   
            
      for(i=0;i<N;i++){   
          for(j=0;j<N;j++){   
             System.out.print(a[i][j]+" ");   
          }   
          System.out.println();   
      }   
}


方法三:
<PRE class=java name="code">/*  
 *  
int baseNum=i  
  1         2               3           ...                   i  
 4i-4      (4i-4)+1         ...     (4i-4)+(i-2)              i+1  
 ...        ...             ...         ...                   i+2  
 ...   (4i-4)+[3(i-2)-2]    ...     (4i-4)+(i-2)+(i-2-1)      ...  
 3i-2       3i-3            ...         2i                    i+(i-1)  
 
 */  
  
  
  
/**  
 *  
 * @author   
 */  
public class PrintSnakeNumberSquare {   
    public static void printN(int baseNum){   
        System.out.println("int baseNum="+baseNum);   
        for(int i=0;i<baseNum;i++){   
            printN_M(baseNum,i,0);   
            System.out.println();   
        }   
    }   
    /**  
     * 打印baseNum宽度的第row行  
     * @param baseNum:打印正方形的边长  
     * @param row:打印正方形的第 row 行  
     * @param outNumber :这个正方形外面层数所占用的数字个数,最外面一层此值为0;  
     *                      长度为n的正方形占用4*n-4个数字,第i层递归需传入前i-1层所占数字总和。  
     */  
    public static void printN_M(int baseNum,int row,int outNumber){   
        if(row==0){//如果是第一行   
            for(int i=1;i<=baseNum;i++){   
                System.out.format("%3s",i+outNumber);   
            }   
            return ;   
        }   
        if(row==(baseNum-1)){//如果是最后一行   
            for(int i=(3*baseNum-2);i>=2*baseNum-1;i--){   
                System.out.format("%3s", i+outNumber);   
            }   
            return;   
        }   
        //row 如果不是第一行或者最后一行,则可以分为三部分   
        // 边长为baseNum正方形第row行的第一个数 ,边长为baseNum-2的第row-1行 ,边长为baseNum正方形的第row行的最后一个数   
        //print first number of the row   
        System.out.format("%3s",4*baseNum-3-row+outNumber);   
        //print middle part of the row by recursive print   
        int nextBaseNum=baseNum-2;   
        int nextRow=row-1;   
        if(nextBaseNum>0&&nextRow>=0){   
            printN_M(nextBaseNum,nextRow,outNumber+4*baseNum-4);   
        }   
        //print last number of the row   
        System.out.format("%3s",baseNum+row+outNumber);   
    }   
  
    public static void main(String[] args){   
  
        PrintSnakeNumberSquare.printN(3);   
        PrintSnakeNumberSquare.printN(4);   
        PrintSnakeNumberSquare.printN(5);   
        PrintSnakeNumberSquare.printN(7);   
  
    }   
}</PRE>   
    
<PRE class=java name="code">int baseNum=3  
  1  2  3  
  8  9  4  
  7  6  5  
int baseNum=4  
  1  2  3  4  
 12 13 14  5  
 11 16 15  6  
 10  9  8  7  
int baseNum=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  
int baseNum=7  
  1  2  3  4  5  6  7  
 24 25 26 27 28 29  8  
 23 40 41 42 43 30  9  
 22 39 48 49 44 31 10  
 21 38 47 46 45 32 11  
 20 37 36 35 34 33 12  
 19 18 17 16 15 14 13  
</PRE>   
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics