VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

[趣味編程]請編寫程序,將下列的數據保存到一個 5X5 的陣列中

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
朱育興



註冊時間: 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 次修改
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 MSN Messenger
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 2 樓

發表發表於: 星期二 五月 11, 2004 12:55 am    文章主題: 引言回覆

解的很漂亮.利用到遞迴的優點!!

這題目解答是用由內而外的嗎?
因為我看到是先向左邊.

若是我的話.就用由外而內的解法!!

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
朱育興



註冊時間: 2003-08-25
文章: 661
來自: 台中市大里區

第 3 樓

發表發表於: 星期二 五月 11, 2004 8:10 am    文章主題: 引言回覆

是筆誤啦!是由外而內的解法,每一次都是右下左上的繞一圈
_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 MSN Messenger
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) 減掉所有格子內的數字即可
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作