青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 32  文章 - 94  trackbacks - 0
<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(8)

隨筆分類

隨筆檔案

好友連接

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

這一周,我寫好了一個連連看,在設計連連看的算法的過程中,我設計了一個可以控制連數的連連看算法,并把連連看改成了“n連看”,然后經過算法優化,使我的連連看算法在20連、無解、矩陣是13*11、最壞情況(一個周圍空曠,一個被包圍)下,運算速度僅2秒左右。而經過優化之前,到了6連的最壞情況下就已經慢得無法接受了。

基本的算法是這樣的:
先寫一個函數f1,判斷點1和點2能否經過某個方向直線到達,方向有上、下、左、右四種

再寫一個函數f2用于循環遞歸調用f1,思路是:如果起始點通過直線到達不了目標點,就把起始點可以直線到達的每個點當成下一次調用的起始點,直到找到目標點就立即返回。f2的參數包括:
n連:用來控制遞歸深度;
2個點(起始點和目標點),用來判斷能夠經過n連連接的2個點;
判斷當前是“上下”或“左右”方向:由于某個點尋找目標點時,我引進了行走方向,這樣可以節省一半的計算量。例如:如果當前方向是“上下”,直線找不到時,下一步遞歸對直線上的每個點的尋找,就只需要“左右”方向,不需要上下;
路徑記錄的列表。
以上是基本思路。

我的算法優化方法很簡單,就是在原來基礎上加上一個對應于所有點的數組,用來記錄對應的點在第多少連的情況下仍然沒有找到目標點。例如:假設總共只能n連,當前點已經被記錄到經過x連仍然找不到目標點,這時,如果繼續遞歸到第n-x+1連又來到該點,這時只剩下x-1連可以遞歸,而當前點已經記錄過x連都無法到達,所以接下來的遞歸可以忽略。
這樣,大大減少了無效的計算,原來在第6連最壞情況下算了40多秒得到無解,現在可以在20連最壞情況下計算2秒得到無解。

那個n連看的算法當時用一天寫出來,非常興奮。無奈電腦是內網,要保密,不能把代碼直接傳出來,之前想過有時間要貼出來,一直忘記了。現在在轉到這個新開的blog。
只貼算法有關部分。用的是python語言:
  1class CY_LianlianKan(..):
  2  def __init__(self):
  3    self.m_Array=[] #存儲內容的矩陣
  4    self.m_LinkCount=#需要連的總數
  5    self.m_FirstPosition=-1 #記下連的第一點
  6    self.MaxWidth=13 #矩陣寬 
  7    self.MaxHeight=12 #矩陣高
  8    #其它初始化內容
  9  #----------------------------------
 10  def IsTargetXYValid(self,X,Y):
 11    #目標坐標是否有效,超過矩陣寬高即無效
 12  #----------------------------------
 13  def IsTargetXYBlank(self,X,Y):
 14    #目標是否空白可以通過
 15  #----------------------------------
 16  def GetArrayXY(self,X,Y):
 17    #獲取矩陣坐標為XY的內容
 18  #----------------------------------
 19  def IsLineable(self,x1,y1,x2,y2,direction):#判斷兩點是否可以通過某方向直線連接
 20  #方向direction:1←2→3↑4↓
 21    if direction==1:
 22      if y1==y2 and x1>x2:
 23        for i in xrange(x2,x1+1):
 24          if self.GetArrayXY(i,y1)>0:
 25            return False
 26        return True
 27    elif direction==2:
 28      if y1==y2 and x1<x2:
 29        for i in xrange(x1,x2+1):
 30          if self.GetArrayXY(i,y1)>0:
 31            return False
 32        return True
 33    elif direction==3:
 34      if x1==x2 and y1<y2:
 35        for i in xrange(y1,y2+1):
 36          if self.GetArrayXY(x1,i)>0:
 37            return False
 38        return True
 39    elif direction==4:
 40      if x1==x2 and y2<y1:
 41        for i in xrange(y2,y1+1):
 42          if self.GetArrayXY(x1,i)>0:
 43            return False
 44        return True
 45    return False
 46  #---------------------------------------
 47  def IsNTurnReachable(self,x1,y1,x2,y2,path,n,LRorUD,hasReachPoint):
 48  #path成功時用于記錄路徑 n當前剩下的連數 LRorUD當前方向是上下還是左右
 49  #hasReachPoint 一個矩陣,用于記錄矩陣中各個點目前已經經過多少連了還找不到目標點
 50    if n<=0:
 51      return False
 52    if LRorUD: #左右方向
 53      for x in xrange(x1-1,-1,-1):#向左
 54        if self.GetArrayXY(x,y1)==and hasReachPoint[y1*self.MaxWidth+x]<n:
 55          if self.IsLineable(x,y1,x2,y2,3or self.IsLinable(x,y1,x2,y2,4):
 56            path+=[x,y1,x2,y2]
 57            return path
 58          else:#到達不了,上下轉彎,遞歸
 59            hasReachPoint[y1*self.MaxWidth+x]+=1
 60            p=self.IsNTurnReachable(x,y1,x2,y2,path+[x,y1],n-1,False,hasReachPoint)
 61            if p!=False:
 62              return p
 63       else:
 64         break
 65      for x in xrange(x1+1,self.MaxWidth):#向右
 66        if self.GetArrayXY(x,y1)==and hasReachPoint[y1*self.MaxWidth+x]<n:
 67          if self.IsLineable(x,y1,x2,y2,3or self.IsLineable(x,y1,x2,y2,4):
 68            path+=[x,y1,x2,y2]
 69            return path
 70          else:#到達不了,上下轉彎,遞歸
 71            hasReachPoint[y1*self.MaxWidth+x]+=1
 72            p=self.IsNTurnReachable(x,y1,x2,y2,path+[x,y1],n-1,False,hasReachPoint)
 73            if p!=False:
 74              return p
 75       else:
 76         break
 77    else:#上下移動
 78      for y in xrange(y1-1,-1,-1):#向上
 79        if self.GetArrayXY(x1,y)==and hasReachPoint[y*self.MaxWidth+x1]<n:
 80          if self.IsLineable(x1,y,x2,y2,1or self.IsLineable(x1,y,x2,y2,2):
 81            path+=[x1,y,x2,y2]
 82            return path
 83          else:#到達不了,左右轉彎,遞歸
 84            hasReachPoint[y*self.MaxWidth+x1]+=1
 85            p=self.IsNTurnReachable(x1,y,x2,y2,path+[x1,y],n-1,True,hasReachPoint)
 86            if p!=False:
 87              return p
 88       else:
 89         break
 90      for y in xrange(y1+1,self.MaxHeight):#向下
 91        if self.GetArrayXY(x1,y)==and hasReachPoint[y*self.MaxWidth+x1]<n:
 92          if self.IsLineable(x1,y,x2,y2,1or self.IsLineable(x1,y,x2,y2,2):
 93            path+=[x1,y,x2,y2]
 94            return path
 95          else:#到達不了,左右轉彎,遞歸
 96            hasReachPoint[y*self.MaxWidth+x1]+=1
 97            p=self.IsNTurnReachable(x1,y,x2,y2,path+[x1,y],n-1,True,hasReachPoint)
 98            if p!=False:
 99              return p
100       else:
101         break
102    return False
103  #--------------------------------------------------------
104  def IsLinkAble(self,x1,y1,x2,y2,n):#n連看的計算函數
105    if n<=0:
106      return False
107    hasReachPoint=[0]*(self.MaxWidth*self.MaxHeight)
108    for i in [0,1,2,3]:
109      if self.isLineable(x1,y1,x2,y2,i):
110        path=[x1,y1,x2,y2]
111        return path
112    path=[x1,y1]
113    p=self.IsNTurnReachalbe(x1,y1,x2,y2,path,n-1,False,hasReachPoint)
114    if p:
115      return p
116    p=self.IsNTurnReachalbe(x1,y1,x2,y2,path,n-1,True,hasReachPoint)
117    if p:
118      return p
119    return False 

當然,現在想到還有可以繼續優化的地方,例如尋路時,從起點和目標點同時出發尋路,而不是只從一個點出發尋路。這樣做或許還可以雙線程優化,不過具體做法就沒有細想了。
posted on 2009-06-28 19:50 陳昱(CY) 閱讀(1628) 評論(2)  編輯 收藏 引用 所屬分類: 算法

FeedBack:
# re: 以前寫的一個N連看 2009-06-29 23:15 小卒
我最近想寫個立體數獨,不過理論功底不行……  回復  更多評論
  
# re: 以前寫的一個N連看 2009-06-30 09:34 CY
那還要先證明立體數獨需要用多少個候選數  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲精品视频一区| 韩日精品在线| 欧美福利视频| 久久国产精品久久久久久电车| 亚洲精品视频啊美女在线直播| 两个人的视频www国产精品| 亚洲欧美韩国| 亚洲一级影院| 一本久久综合亚洲鲁鲁| 亚洲日本成人网| 在线免费观看日本欧美| 亚洲一区免费看| 亚洲人成网站在线观看播放| 欧美成人有码| 亚洲深夜福利| 国产一区二区视频在线观看| 国产精品99免费看 | 91久久久久| 一区免费观看| 激情成人av| 韩日精品视频一区| 国精品一区二区| 国产午夜精品视频| 国产美女高潮久久白浆| 国产九九精品| 国产精品有限公司| 国产精品视区| 国产精品日本精品| 国产精品影视天天线| 国产精品香蕉在线观看| 国产精品日韩久久久| 国产酒店精品激情| 国产亚洲成精品久久| 国产性色一区二区| 国产午夜精品麻豆| 国内伊人久久久久久网站视频| 国产一区二区三区精品久久久| 国内外成人免费激情在线视频网站| 国产亚洲a∨片在线观看| 国内精品国语自产拍在线观看| 国模套图日韩精品一区二区| 国产一区二区三区日韩| 揄拍成人国产精品视频| 亚洲欧洲精品成人久久奇米网| 亚洲精品国产精品久久清纯直播| 99视频+国产日韩欧美| 亚洲一区日韩在线| 久久精精品视频| 欧美aaa级| 亚洲欧洲一区二区天堂久久| 99re热这里只有精品视频 | 美女精品自拍一二三四| 欧美成人精品在线| 国产精品草莓在线免费观看| 国产精品免费一区二区三区在线观看 | 99精品热视频| 亚洲欧美一区二区三区在线| 久久久国产视频91| 欧美风情在线观看| 国产精品手机视频| 亚洲国产福利在线| 在线亚洲美日韩| 久久久久久综合网天天| 亚洲国产精品久久91精品| 一二三四社区欧美黄| 久久精品2019中文字幕| 欧美激情国产日韩| 国产欧美一区二区三区国产幕精品 | 乱中年女人伦av一区二区| 欧美日韩一区二区三区四区在线观看 | 亚洲欧美精品suv| 久久亚洲欧洲| 日韩亚洲欧美一区| 久久久久久电影| 国产精品高潮久久| 亚洲国产精品一区二区第四页av| 亚洲一区二区三区四区视频| 米奇777在线欧美播放| 一区二区高清视频在线观看| 久久久久久穴| 国产九色精品成人porny| 亚洲精品综合| 麻豆成人av| 亚洲一区二区三区午夜| 欧美精品亚洲二区| 在线观看国产精品网站| 欧美亚洲免费| 99精品福利视频| 久久夜色精品国产欧美乱极品| 国产精品视频yy9099| 亚洲精品四区| 蜜桃久久av一区| 亚洲欧美中文日韩v在线观看| 欧美欧美午夜aⅴ在线观看| 樱桃国产成人精品视频| 欧美在线精品免播放器视频| 日韩视频免费| 欧美激情视频一区二区三区在线播放 | 牛牛影视久久网| 国产中文一区| 欧美在线视频一区二区| 99国产一区二区三精品乱码| 牛牛国产精品| 在线精品一区二区| 久久视频在线视频| 亚洲影院色无极综合| 久久久青草青青国产亚洲免观| 亚洲精品国产精品久久清纯直播| 久久久综合网站| 国内精品国产成人| 久久精品最新地址| 午夜精品福利一区二区三区av| 欧美日韩一级黄| 夜久久久久久| 亚洲精品一区在线观看| 欧美精品在线观看| 亚洲精品乱码久久久久久日本蜜臀| 老鸭窝亚洲一区二区三区| 久久av最新网址| 精品电影在线观看| 免费欧美视频| 老司机成人在线视频| 亚洲国产另类 国产精品国产免费| 裸体一区二区三区| 另类酷文…触手系列精品集v1小说| 好吊色欧美一区二区三区视频| 久久国产直播| 久久精品国产v日韩v亚洲| 激情综合视频| 欧美激情四色| 欧美日本三区| 亚洲女女做受ⅹxx高潮| 亚洲欧美清纯在线制服| 国产在线不卡精品| 毛片基地黄久久久久久天堂| 久久综合久久综合久久综合| 亚洲国产精品悠悠久久琪琪| 欧美激情一区三区| 欧美日韩精品一区二区| 亚洲一区二区视频在线观看| 亚洲欧美国产日韩中文字幕| 国产日产欧美a一级在线| 久久永久免费| 欧美黄免费看| 亚洲欧美日韩视频二区| 欧美一区不卡| 欧美三级在线视频| 欧美一区二区三区免费观看视频| 欧美一区二区在线视频| 亚洲国产免费看| 亚洲免费观看高清完整版在线观看熊 | 欧美多人爱爱视频网站| 欧美成年人网站| 亚洲永久字幕| 久久久精品国产免大香伊| 亚洲精品日韩综合观看成人91| 一区二区三区色| 韩国三级在线一区| 亚洲国产精品视频| 国产伦精品一区二区三区视频孕妇| 久久天天躁狠狠躁夜夜av| 欧美激情欧美狂野欧美精品| 亚洲综合另类| 猛干欧美女孩| 亚洲在线免费观看| 久久久免费观看视频| 亚洲视频一二| 久久久久看片| 亚洲一区在线免费| 久久久福利视频| 亚洲性感激情| 卡一卡二国产精品| 亚洲免费在线电影| 男同欧美伦乱| 久久成人一区| 欧美日韩国产精品一卡| 久久蜜桃香蕉精品一区二区三区| 欧美精品亚洲| 久久综合五月| 国产精品毛片一区二区三区| 欧美a级一区二区| 国产精品有限公司| 亚洲美女啪啪| 91久久夜色精品国产九色| 午夜欧美精品| 亚洲综合色婷婷| 欧美精品久久天天躁| 久久久精品国产免费观看同学| 欧美视频观看一区| 亚洲国产婷婷香蕉久久久久久99 | 在线一区观看| 可以免费看不卡的av网站| 久久gogo国模裸体人体| 欧美日韩系列| 亚洲大片免费看| 在线观看欧美视频| 午夜亚洲伦理| 香蕉成人久久| 欧美三级在线视频| 亚洲精品一级|