jenlp110 的 一道面試題

轉自:http://www.iteye.com/topic/545378

源於作者:jenlp110 的 一道面試題

文章分類:Java編程



一個畫圖程序 要求打印出 :

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();   
        }   
    }   
}  

解決方法二:
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>   
 我寫的解決方法:
import java.util.*;
public class MyPrint
{
	public static void main(String[] args)throws Exception{
		int lenght = 5 ;
		int initV = 1;
		if(args.length>=1){
		   lenght = Integer.parseInt(args[0]);
		}
		if(args.length>=2){
		   initV = Integer.parseInt(args[1]);
		}
		
		NumPrint m = new NumPrint();
		m.sort( lenght,initV);
	}
	
}

class NumPrint
{
	public static final int right = 0;
	public static final int down = 1;
	public static final int left = 2;
	public static final int up = 3;

	boolean islast = false;

	int[][] arr;

	public void sort(final int length, int initV){
		arr = new int[length][length];
		arr[0][0] = initV;
		int len = length;
		Map<String, Integer> map = fz(right, len-1, 0, 0, arr);
		len --;
		int ward = right;
		int cou=1;
		while(len>0){
			ward = (ward+1)%4;
			map = fz(ward, len, map.get("x"), map.get("y"),arr);
			if(cou++==2){
				len--;
				cou=1;
			}
		}

		print();
	}

	private Map<String, Integer> fz(int ward, int n, int x, int y, int[][] a){
		Map<String, Integer> map = new HashMap<String, Integer>();

		switch(ward){
			case right:
			while(n>0){
				a[x][++y] = a[x][y-1]+1;
				n--;
			}
			case down:
			while(n>0){
				a[++x][y] = a[x-1][y]+1;
				n--;
			}
			case left:
			while(n>0){
				a[x][--y] = a[x][y+1]+1;
				n--;
			}
			case up:
			while(n>0){
				a[--x][y] = a[x+1][y]+1;
				n--;
			}
		}

		map.put("x",x);
		map.put("y",y);
		return map;
	}

	private void print(){
		int length = arr.length;
		for(int i=0;i<length;i++){
			for(int j=0; j<length; j++){
				System.out.print(arr[i][j]+"\t");
			}
			System.out.println();
		}	
	}
}
 
發佈了71 篇原創文章 · 獲贊 0 · 訪問量 2504
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章