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

作者文章来源:[url]http://www.iteye.com/topic/545378[/url]

一个画图程序 要求打印出 :
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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值