日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Delphi下实现全屏快速找图找色 二、矩阵遍历

發布時間:2023/12/2 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Delphi下实现全屏快速找图找色 二、矩阵遍历 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

二、矩陣遍歷

  矩陣遍歷是一個數據結構方面的問題。假設有一個矩陣Matrix,它共有RowCount行,每行有ColCount列,當利用y表示行數,x表示列數,那么利用Matrix[y,x]就可以訪問矩陣中的任意元素。假設有一個10×10大小的矩陣,它的遍歷方法有以下三種:


此主題相關圖片如下:
(圖1)
?

在上圖中矩陣中的數字表示遍歷到元素的先后次序,箭頭表示遍歷的方向。第一種的一般遍歷法在很多編程書上都有介紹,而且經常作為循環代碼的示范程序使用。這種遍歷方法稍加修改就可以做到從右上角開始、從左下角開始、從右下角開始。這種遍歷方法很簡單,這里就不多說了。與一般遍歷相反,螺旋遍歷在所有的編程書和數據結構書上都沒有講到?,F在詳細的說明一下螺旋遍歷。
?

  螺旋遍歷可以做到以一個基點為中心向四周遍歷,這個基點可以不是矩陣的中心點,實際上基點可以是矩陣上的任意一點,甚至可以是矩陣外的點。注意:這里所說的“點”是指可以用(y,x)訪問的元素,當(y,x)坐標超出矩陣范圍,例如(-1,-1),這就是矩陣外的點??梢钥闯雎菪闅v對于找圖找色非常有用。螺旋遍歷實現起來并不難,仔細觀察圖1中的螺旋遍歷就會發現遍歷可以由遍歷方向和遍歷步數組成。從(3,2)點開始向上遍歷一步,再向右遍歷一步,再向下遍歷二步,再向左遍歷二步,這時完成一輪,遍歷方向又開始向上、向右、向下、向左一輪又一輪,同時遍歷步數逐步加大。當向上遍歷時y總是減1;當向右遍歷時x總是加1;當向下遍歷時y總是加1;當向左遍歷時x總是減1,這樣可以根據遍歷方向計算出坐標的變化。另外螺旋遍歷有可能會訪問到矩陣外的點,在訪問時要進行判斷。正是由于螺旋遍歷會訪問矩陣外的點,遍歷循環將無法停止從而出現死循環。這時要設定一個訪問計數VisitCount,當遍歷循環訪問了矩陣中的所有點后退出循環。綜上所述,螺旋遍歷的示范代碼如下:

type
????//遍歷方向
????TAspect?=?(asLeft,?asRight,?asUp,?asDown);

const
????//移動坐標差
????MoveVal?:?array?[asLeft..asDown]?of?TPoint?=?(
????????(X?:?-1;?Y?:??0),?//asLeft
????????(X?:??1;?Y?:??0),?//asRight
????????(X?:??0;?Y?:?-1),?//asUp
????????(X?:??0;?Y?:??1)??//asDown
????);

????//矩陣大小
????RowCount?=?10;
????ColCount?=?10;

var
????//矩陣
????Matrix?:?array?[0..RowCount-1,0..ColCount-1]?of?Integer;

//螺旋遍歷(不支持步長)
procedure?MatrixOrder1_(y,x?:?Integer);
var
????Aspect?:?TAspect;
????VisitCount,Count,i?:?Integer;
begin
????VisitCount:=0;
????Aspect:=asUp;
????Count:=1;
????while?VisitCount<(RowCount*ColCount)?do
????begin
????????for?i:=0?to?Count-1?do
????????begin
????????????if?(x>=0)?and?(x<ColCount)?and
???????????????(y>=0)?and?(y<RowCount)?then
????????????begin

????????????????//訪問矩陣元素
????????????????Matrix[y,x]:=VisitCount;

????????????????VisitCount:=VisitCount+1;
????????????end;
????????????x:=x+MoveVal[Aspect].X;
????????????y:=y+MoveVal[Aspect].Y;
????????end;
????????case?Aspect?of
????????????asLeft??:?begin?Aspect:=asUp;???Count:=Count+1;?end;
????????????asRight?:?begin?Aspect:=asDown;?Count:=Count+1;?end;
????????????asUp????:?begin?Aspect:=asRight;?end;
????????????asDown??:?begin?Aspect:=asLeft;??end;
????????end;
????end;
end;

  這里還有一個步長的問題,所謂步長就是指在遍歷的時候跳過一些點,只平均訪問矩陣中的某些點。例如以下數據就是步長為2以(3,2)為基點的螺旋遍歷后的矩陣,其中“-”表示遍歷時沒有訪問到的點。

輸出矩陣:
???+??0??1??2??3??4??5??6??7??8??9
?0?:??-??-??-??-??-??-??-??-??-??-
?1?:??8??-??1??-??2??-??9??-?16??-
?2?:??-??-??-??-??-??-??-??-??-??-
?3?:??7??-??0??-??3??-?10??-?17??-
?4?:??-??-??-??-??-??-??-??-??-??-
?5?:??6??-??5??-??4??-?11??-?18??-
?6?:??-??-??-??-??-??-??-??-??-??-
?7?:?15??-?14??-?13??-?12??-?19??-
?8?:??-??-??-??-??-??-??-??-??-??-
?9?:?24??-?23??-?22??-?21??-?20??-

  使用步長可以實現矩陣的抽樣查找,但上面給出的螺旋遍歷算法卻不支持步長。因為它要利用訪問計數退出循環,使用步長時會使矩陣中訪問到的點的數目不確定,使的上述算法出現死循環。對上述算法的一個改進是使用一個邏輯變量記錄遍歷一輪是否有訪問到點。如果沒有,說明這一輪訪問已經以位于矩陣之外可以退出循環。當步長為1時這種改進的算法要比前面的算法更慢,因為它要“空轉”一輪。而且這種算法也不支持矩陣外的點作為基點,它會使循環提前退出。支持步長的螺旋遍歷算法的示范代碼如下:注意這時的VisitCount僅作為測試使用,不作為退出循環的條件。

type
????//遍歷方向
????TAspect?=?(asLeft,?asRight,?asUp,?asDown);

const
????//遍歷步長
????Interval?=?2;

????//移動坐標差
????MoveVal?:?array?[asLeft..asDown]?of?TPoint?=?(
????????(X?:?-Interval;?Y?:?0),?//asLeft
????????(X?:??Interval;?Y?:?0),?//asRight
????????(X?:?0;?Y?:?-Interval),?//asUp
????????(X?:?0;?Y?:??Interval)??//asDown
????);

????//矩陣大小
????RowCount?=?10;
????ColCount?=?10;

var
????//矩陣
????Matrix?:?array?[0..RowCount-1,0..ColCount-1]?of?Integer;

//螺旋遍歷2(支持步長)
procedure?MatrixOrder2(y,x?:?Integer);
var
????Aspect?:?TAspect;
????VisitCount?:?Integer;?//訪問計數,測試用
????Count,i?:?Integer;
????Visit?:?Boolean;
begin
????VisitCount:=0;?//訪問計數,測試用
????Visit:=false;
????Aspect:=asUp;
????Count:=1;
????while?true?do
????begin
????????for?i:=0?to?Count-1?do
????????begin
????????????if?(x>=0)?and?(x<ColCount)?and
???????????????(y>=0)?and?(y<RowCount)?then
????????????begin

????????????????//訪問矩陣元素
????????????????Matrix[y,x]:=VisitCount;
????????????????VisitCount:=VisitCount+1;?//訪問計數,測試用

????????????????Visit:=true;
????????????end;
????????????x:=x+MoveVal[Aspect].X;
????????????y:=y+MoveVal[Aspect].Y;
????????end;
????????case?Aspect?of
????????????asLeft?:?begin
????????????????if?not?Visit?then?break;
????????????????Visit:=false;
????????????????Aspect:=asUp;
????????????????Count:=Count+1;
????????????end;
????????????asRight?:?begin?Aspect:=asDown;?Count:=Count+1;?end;
????????????asUp????:?begin?Aspect:=asRight;?end;
????????????asDown??:?begin?Aspect:=asLeft;??end;
????????end;
????end;
end;
?
  對于回形遍歷與螺旋遍歷大同小異,這里就不多說了。在下面的壓縮包中是矩陣遍歷的示范程序,里面有一般遍歷、螺旋遍歷和回形遍歷的示范代碼,可以用于參考。

轉載于:https://www.cnblogs.com/MaxWoods/archive/2013/06/14/3135360.html

總結

以上是生活随笔為你收集整理的Delphi下实现全屏快速找图找色 二、矩阵遍历的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。