 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
朱育興
註冊時間: 2003-08-25 文章: 661 來自: 台中市大里區
第 1 樓
|
發表於: 星期五 五月 07, 2004 4:19 pm 文章主題: [趣味編程]請編寫程序,將下列的數據保存到一個 5X5 的陣列中 |
|
|
* 題目:請編寫程序,將下列的數據保存到一個 5X5 的陣列中。
* 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
* 規律是繞著圈增加
* 來源:Myf1 http://www.myf1.net/bbs/dispbbs.asp?BoardID=1&id=249960&replyID=303125&star=2&skin=
* -----------------------------------------------------------------
* 我自己的解答:
* 為 m 列 n 行陣列賦值,m>=1,n>=1
* 使用範例:m = 5, n = 7
* 給陣列求值如下:
* 1 2 3 4 5 6 7
* 20 21 22 23 24 25 8
* 19 32 33 34 35 26 9
* 18 31 30 29 28 27 10
* 17 16 15 14 13 12 11
代碼: |
* 初始值
m = 5
n = 7
* 求解
DIMENSION M_aCircle[m,n]
STORE 0 TO M_aCircle
=CircArry(1,m,n,1)
* 顯示?#125;列值
FOR W_SUB_A = 1 TO m
?
FOR W_SUB_B = 1 TO n
?? TRANSFORM(M_aCircle[W_SUB_A,W_SUB_B],"@Z 9999")
ENDFOR
ENDFOR
FUNCTION CircArry
* 思維:每一次?#93;最外層一圈,一層一層的剝皮
LPARAMETERS L_nStNum,L_nRows,L_nCols,L_nCircle
LOCAL W1_nCurNum,W1_nCurPhyRow,W1_nCurPhyCol,W1_SUB_A
W1_nCurNum = L_nStNum && 目前的數字
W1_nCurPhyRow = L_nCircle && 目前實際列數
W1_nCurPhyCol = L_nCircle && 目前實際行數
* 向右
FOR W1_SUB_A = 1 TO L_nCols
M_aCircle[W1_nCurPhyRow,W1_nCurPhyCol] = W1_nCurNum
W1_nCurNum = W1_nCurNum + 1
W1_nCurPhyCol = W1_nCurPhyCol + 1
ENDFOR
W1_nCurPhyCol = W1_nCurPhyCol - 1
* 向下
FOR W1_SUB_A = 1 TO L_nRows-1
W1_nCurPhyRow = W1_nCurPhyRow + 1
M_aCircle[W1_nCurPhyRow,W1_nCurPhyCol] = W1_nCurNum
W1_nCurNum = W1_nCurNum + 1
ENDFOR
* 向左
IF L_nRows > 1 AND L_nCols > 1
FOR W1_SUB_A = 1 TO L_nCols-1
W1_nCurPhyCol = W1_nCurPhyCol - 1
M_aCircle[W1_nCurPhyRow,W1_nCurPhyCol] = W1_nCurNum
W1_nCurNum = W1_nCurNum + 1
ENDFOR
ENDIF
* 向上
IF L_nRows > 1 AND L_nCols > 1
FOR W1_SUB_A = 1 TO L_nRows-2
W1_nCurPhyRow = W1_nCurPhyRow - 1
M_aCircle[W1_nCurPhyRow,W1_nCurPhyCol] = W1_nCurNum
W1_nCurNum = W1_nCurNum + 1
ENDFOR
ENDIF
* 下一圈
IF L_nRows >= 3 AND L_nCols >= 3
=CircArry(W1_nCurNum,L_nRows-2,L_nCols-2,L_nCircle+1)
ENDIF
RETURN .T. |
_________________ 希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
朱育興 在 星期二 五月 11, 2004 8:11 am 作了第 1 次修改 |
|
回頂端 |
|
 |
Ruey
註冊時間: 2003-03-12 文章: 1698 來自: tunglo
第 2 樓
|
發表於: 星期二 五月 11, 2004 12:55 am 文章主題: |
|
|
解的很漂亮.利用到遞迴的優點!!
這題目解答是用由內而外的嗎?
因為我看到是先向左邊.
若是我的話.就用由外而內的解法!! _________________ #############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!
學會VFP使用者社區的搜尋,Code才會更有趣~
############################# |
|
回頂端 |
|
 |
朱育興
註冊時間: 2003-08-25 文章: 661 來自: 台中市大里區
第 3 樓
|
|
回頂端 |
|
 |
mrhsuap
註冊時間: 2003-08-09 文章: 3
第 4 樓
|
發表於: 星期四 五月 20, 2004 5:37 pm 文章主題: 用不同的語言,不同的想法做做看,也是蠻有趣的 |
|
|
代碼: | # 使用Perl來解題
# Range
$rowmax=5;
$colmax=7;
$num=1;
$row=$col=0;
# 東南西北
@dir=@dirtmp=qw/E:0:1 S:1:0 W:0:-1 N:-1:0/;
# 做上記號 X
@col=map { 'X' } 0..$colmax-1;
@grid=map {[@col]} 0..$rowmax-1;
# 起始位置放上 1
$grid[0][0]=$num++;
# 散步了
while (1) {
if (forward()) {
$grid[$row][$col]=$num++;
@dirtmp=@dir;
} else {
push @dir,(shift @dir); # linked list
shift @dirtmp; # 順時針方向
last unless @dirtmp; # 填滿了
}
}
# 印出結果
for $items (@grid) {
for $item (@$items) {
printf '%4d',$item
}
print "\n";
}
sub forward {
my ($dir,$deltarow,$deltacol)=split /:/, $dir[0];
$row+=$deltarow;
$col+=$deltacol;
if ($grid[$row][$col] eq 'X') {
return 1;
} else {
$row-=$deltarow;
$col-=$deltacol;
return 0
}
} |
|
|
回頂端 |
|
 |
mrhsuap
註冊時間: 2003-08-09 文章: 3
第 5 樓
|
發表於: 星期五 五月 21, 2004 11:53 am 文章主題: 稍微改一下 就可以逆時鐘方向行走 |
|
|
代碼: | #使用Perl來解題
#大小
$rowmax=5;
$colmax=7;
$num=1;
#逆時鐘
@dir=@dirtmp=qw/W:0:-1 s:1:0 E:0:1 N:-1:0/;
#做上記號 X
@col=map { 'X' } 0..$colmax-1;
@grid=map {[@col]} 0..$rowmax-1;
#起始位置放上 1
$row=0;
$col=$colmax-1;
$grid[$row][$col]=$num++;
#散步了
while (1) {
if (forward()) {
$grid[$row][$col]=$num++;
@dirtmp=@dir;
} else {
push @dir,(shift @dir); # linked list
shift @dirtmp; # 下一個方向
last unless @dirtmp; # 填滿了
}
}
#印出結果
for $items (@grid) {
for $item (@$items) {
printf '%4d',$item
}
print "\n";
}
sub forward {
my ($dir,$deltarow,$deltacol)=split /:/, $dir[0];
$row+=$deltarow;
$col+=$deltacol;
if ($grid[$row][$col] eq 'X') {
return 1;
} else {
$row-=$deltarow;
$col-=$deltacol;
return 0
}
} |
輸出
代碼: | 7 6 5 4 3 2 1
8 25 24 23 22 21 20
9 26 35 34 33 32 19
10 27 28 29 30 31 18
11 12 13 14 15 16 17 |
|
|
回頂端 |
|
 |
Ruey
註冊時間: 2003-03-12 文章: 1698 來自: tunglo
第 6 樓
|
發表於: 星期五 五月 21, 2004 7:45 pm 文章主題: |
|
|
朱育興 寫到: | 是筆誤啦!是由外而內的解法,每一次都是右下左上的繞一圈 |
但有沒有考慮思考用內而外的程式.
剛想了一下.這種方式應該比較複雜才是.
也許你已經想到了!! _________________ #############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!
學會VFP使用者社區的搜尋,Code才會更有趣~
############################# |
|
回頂端 |
|
 |
mrhsuap
註冊時間: 2003-08-09 文章: 3
第 7 樓
|
發表於: 星期五 五月 21, 2004 10:46 pm 文章主題: |
|
|
Ruey 寫到: | 朱育興 寫到: | 是筆誤啦!是由外而內的解法,每一次都是右下左上的繞一圈 |
但有沒有考慮思考用內而外的程式.
剛想了一下.這種方式應該比較複雜才是.
也許你已經想到了!! |
不會 !
先依原來方式走完所有格子
再用 (nxm+1) 減掉所有格子內的數字即可 |
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|