2009年12月28日星期一

一道看似簡單的二維數組題——螺旋矩陣的實現

近半年來都在讀小說,看雜文,不碰計算機很久很久了,由於近日找了一份Android手機平台上游戏开发的工作,才“不得不”再次涉足計算機科學領域,慚愧~
近幾天都在網絡上遊蕩,恰巧今天進入久違的Google的TopLanguage討論組,就翻了翻裡邊的帖子。看到這麼一篇:{面试}{技术}一道简单的二维数组面试题,内容大致是这样的:

年底了,轻松一下。

http://www.javaeye.com/topic/545378?page=1

一个画图程序 要求打印出

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

我这里加一个限制,i<=25。

题目很简单,大一学生分分钟就能写出来。
语言不限,常规语言都行,C/C++/Java/C#/Ruby/Python/Perl。
代码简洁易懂为佳。(这里算是一个反例: http://www.javaeye.com/topic/557924 )
请各路高手各显神通,我会在第10楼贴出自己的C程序。


大致看了體目,用筆在紙上走了一遍程序實現的過程,看似簡單的問題,其實需要動一動腦筋才能做出來的。

花了一個多小時,用java實現了題目的要求(時間太長了),源代碼:

import java.lang.Math;
class practise {
public static void main(String[] arguments) {
for(int cycle = 5;cycle < 26;cycle++) {
int i,j;
int[][] matrix = new int[cycle][cycle];
int shangxian = cycle - 1;
matrix[0][0] = 1;
int kaishi,jieshu,jishu,flag;
jishu = 1;
for(int xunhuan = cycle - 1; xunhuan > 2; xunhuan--){
flag = Math.abs(xunhuan - shangxian);
kaishi = Math.abs(shangxian - xunhuan);
i = flag;

for ( j = kaishi; j < xunhuan + 1;j++){
matrix[i][j] = jishu;
jishu++;
}
jishu--;
j--;
for ( i = kaishi; i < xunhuan + 1;i++){
matrix[i][j] = jishu;
jishu++;
}
jishu--;
flag = Math.abs(flag - shangxian);
i = flag;
for ( j = flag ; j > kaishi;j--){
matrix[i][j] = jishu;
jishu++;
}
for ( i = flag; i > kaishi ;i--){
matrix[i][j] = jishu;
jishu++;
}
}
matrix[cycle/2][cycle/2] = cycle*cycle;
System.out.println("int = " + cycle);
for(i = 0; i < cycle; i++){
for(j = 0;j < cycle;j ++){
System.out.print(matrix[i][j] + " ");
}
System.out.print("\n");
}
System.out.println();
}
}
}

明天就是Heat Transfer的測驗了,時間挺緊。不過這程序真是不盡人意,變量的命名很混亂,而且沒有注解,估計哪天,連我自己都看不懂這份程序了:(
大致思路就是把矩陣的螺旋過程做成循環,5X5的矩陣,就走5次循環。而每次循環的具體實現過程,就在程序中了:)

加油Heat Transfer!

没有评论:

发表评论