  | 
				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) 減掉所有格子內的數字即可 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |