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

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

常用鏈接

留言簿(8)

隨筆分類(lèi)

隨筆檔案

好友連接

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

這一周,我寫(xiě)好了一個(gè)連連看,在設(shè)計(jì)連連看的算法的過(guò)程中,我設(shè)計(jì)了一個(gè)可以控制連數(shù)的連連看算法,并把連連看改成了“n連看”,然后經(jīng)過(guò)算法優(yōu)化,使我的連連看算法在20連、無(wú)解、矩陣是13*11、最壞情況(一個(gè)周?chē)諘纾粋€(gè)被包圍)下,運(yùn)算速度僅2秒左右。而經(jīng)過(guò)優(yōu)化之前,到了6連的最壞情況下就已經(jīng)慢得無(wú)法接受了。

基本的算法是這樣的:
先寫(xiě)一個(gè)函數(shù)f1,判斷點(diǎn)1和點(diǎn)2能否經(jīng)過(guò)某個(gè)方向直線(xiàn)到達(dá),方向有上、下、左、右四種

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

我的算法優(yōu)化方法很簡(jiǎn)單,就是在原來(lái)基礎(chǔ)上加上一個(gè)對(duì)應(yīng)于所有點(diǎn)的數(shù)組,用來(lái)記錄對(duì)應(yīng)的點(diǎn)在第多少連的情況下仍然沒(méi)有找到目標(biāo)點(diǎn)。例如:假設(shè)總共只能n連,當(dāng)前點(diǎn)已經(jīng)被記錄到經(jīng)過(guò)x連仍然找不到目標(biāo)點(diǎn),這時(shí),如果繼續(xù)遞歸到第n-x+1連又來(lái)到該點(diǎn),這時(shí)只剩下x-1連可以遞歸,而當(dāng)前點(diǎn)已經(jīng)記錄過(guò)x連都無(wú)法到達(dá),所以接下來(lái)的遞歸可以忽略。
這樣,大大減少了無(wú)效的計(jì)算,原來(lái)在第6連最壞情況下算了40多秒得到無(wú)解,現(xiàn)在可以在20連最壞情況下計(jì)算2秒得到無(wú)解。

那個(gè)n連看的算法當(dāng)時(shí)用一天寫(xiě)出來(lái),非常興奮。無(wú)奈電腦是內(nèi)網(wǎng),要保密,不能把代碼直接傳出來(lái),之前想過(guò)有時(shí)間要貼出來(lái),一直忘記了。現(xiàn)在在轉(zhuǎn)到這個(gè)新開(kāi)的blog。
只貼算法有關(guān)部分。用的是python語(yǔ)言:
  1class CY_LianlianKan(..):
  2  def __init__(self):
  3    self.m_Array=[] #存儲(chǔ)內(nèi)容的矩陣
  4    self.m_LinkCount=#需要連的總數(shù)
  5    self.m_FirstPosition=-1 #記下連的第一點(diǎn)
  6    self.MaxWidth=13 #矩陣寬 
  7    self.MaxHeight=12 #矩陣高
  8    #其它初始化內(nèi)容
  9  #----------------------------------
 10  def IsTargetXYValid(self,X,Y):
 11    #目標(biāo)坐標(biāo)是否有效,超過(guò)矩陣寬高即無(wú)效
 12  #----------------------------------
 13  def IsTargetXYBlank(self,X,Y):
 14    #目標(biāo)是否空白可以通過(guò)
 15  #----------------------------------
 16  def GetArrayXY(self,X,Y):
 17    #獲取矩陣坐標(biāo)為XY的內(nèi)容
 18  #----------------------------------
 19  def IsLineable(self,x1,y1,x2,y2,direction):#判斷兩點(diǎn)是否可以通過(guò)某方向直線(xiàn)連接
 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成功時(shí)用于記錄路徑 n當(dāng)前剩下的連數(shù) LRorUD當(dāng)前方向是上下還是左右
 49  #hasReachPoint 一個(gè)矩陣,用于記錄矩陣中各個(gè)點(diǎn)目前已經(jīng)經(jīng)過(guò)多少連了還找不到目標(biāo)點(diǎn)
 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:#到達(dá)不了,上下轉(zhuǎn)彎,遞歸
 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:#到達(dá)不了,上下轉(zhuǎn)彎,遞歸
 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:#上下移動(dòng)
 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:#到達(dá)不了,左右轉(zhuǎn)彎,遞歸
 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:#到達(dá)不了,左右轉(zhuǎn)彎,遞歸
 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連看的計(jì)算函數(shù)
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 

當(dāng)然,現(xiàn)在想到還有可以繼續(xù)優(yōu)化的地方,例如尋路時(shí),從起點(diǎn)和目標(biāo)點(diǎn)同時(shí)出發(fā)尋路,而不是只從一個(gè)點(diǎn)出發(fā)尋路。這樣做或許還可以雙線(xiàn)程優(yōu)化,不過(guò)具體做法就沒(méi)有細(xì)想了。
posted on 2009-06-28 19:50 陳昱(CY) 閱讀(1626) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): 算法

FeedBack:
# re: 以前寫(xiě)的一個(gè)N連看 2009-06-29 23:15 小卒
我最近想寫(xiě)個(gè)立體數(shù)獨(dú),不過(guò)理論功底不行……  回復(fù)  更多評(píng)論
  
# re: 以前寫(xiě)的一個(gè)N連看 2009-06-30 09:34 CY
那還要先證明立體數(shù)獨(dú)需要用多少個(gè)候選數(shù)  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              欧美成人午夜激情在线| 一区二区三区四区五区精品视频| 国产欧美日韩亚州综合| 欧美性大战xxxxx久久久| 欧美搞黄网站| 欧美黄色aaaa| 欧美日韩一区二区三区视频| 欧美日韩美女一区二区| 国产精品观看| 国产在线日韩| 亚洲高清不卡在线| 一本久道久久综合中文字幕| 亚洲伊人网站| 久久久久在线| 亚洲日本成人| 中国女人久久久| 亚洲欧美日韩一区二区在线| 久久久久一区| 国产精品v亚洲精品v日韩精品| 国产精品私拍pans大尺度在线| 国产一区再线| 中日韩在线视频| 久久精品91久久久久久再现| 欧美aa在线视频| 中文久久精品| 老司机午夜精品视频在线观看| 久久午夜影视| 亚洲国产精品小视频| 亚洲最新在线| 欧美综合国产| 欧美四级在线观看| 精品动漫3d一区二区三区免费| 亚洲另类黄色| 久久久久久久久久久久久女国产乱| 欧美成人影音| 亚洲一区在线观看视频| 欧美99久久| 国内精品久久久久影院优| 99伊人成综合| 亚洲第一黄色| 久久av资源网| 国产精品久久久久影院亚瑟| 亚洲激情成人| 久久资源在线| 欧美一级专区| 国产欧美日本一区二区三区| 亚洲视频国产视频| 欧美不卡在线| 欧美一级网站| 国产精品免费看片| 亚洲午夜国产成人av电影男同| 欧美国产精品久久| 久久亚洲美女| 一区二区亚洲精品国产| 久久精品国产一区二区三区免费看| av不卡免费看| 欧美三级视频在线播放| 亚洲乱码精品一二三四区日韩在线 | 久久另类ts人妖一区二区| 一本久道久久综合中文字幕| 欧美激情一级片一区二区| 最新国产精品拍自在线播放| 欧美成人午夜视频| 久久天堂成人| 亚洲成色www8888| 久久夜色撩人精品| 久久精品夜色噜噜亚洲aⅴ | 亚洲精品少妇| 亚洲国产清纯| 欧美日本精品| 中文亚洲视频在线| 在线视频日本亚洲性| 国产精品乱码妇女bbbb| 午夜精品免费| 欧美一区二区三区电影在线观看| 国产人久久人人人人爽| 久久久无码精品亚洲日韩按摩| 亚洲性感激情| 亚洲综合色在线| 亚洲视频综合| 国产精品尤物| 久久婷婷国产综合尤物精品| 玖玖综合伊人| 99国内精品久久| 亚洲无亚洲人成网站77777| 国产午夜亚洲精品羞羞网站| 免费成人性网站| 欧美国产一区二区| 性欧美大战久久久久久久免费观看| 亚洲影院一区| 亚洲成人资源| 一区二区三区视频在线播放| 国内精品视频在线播放| 亚洲二区在线观看| 国产精品视频网| 欧美大胆成人| 国产精品一二三视频| 欧美高清视频一二三区| 国产精品高清在线| 欧美大片va欧美在线播放| 国产精品毛片一区二区三区| 欧美成人免费va影院高清| 欧美区日韩区| 久久久久久久综合色一本| 欧美国产91| 久久九九电影| 欧美四级电影网站| 欧美大片在线观看一区| 国产精品一区二区三区四区五区| 欧美国产日韩一区| 国产婷婷成人久久av免费高清| 亚洲日本aⅴ片在线观看香蕉| 国产亚洲女人久久久久毛片| 日韩一区二区免费看| 在线免费观看日韩欧美| 午夜精品国产精品大乳美女| 在线视频日韩| 噜噜噜91成人网| 久久精品91久久香蕉加勒比| 欧美午夜视频一区二区| 亚洲国产视频直播| 亚洲电影激情视频网站| 欧美亚洲一级片| 午夜精品福利视频| 欧美日韩免费看| 91久久精品www人人做人人爽| 激情综合久久| 久久国产欧美| 久久精品男女| 国产日韩欧美一区二区三区在线观看| 99成人免费视频| 亚洲深爱激情| 欧美日韩在线视频首页| 91久久久精品| 亚洲欧洲在线播放| 母乳一区在线观看| 欧美韩日一区| 亚洲激情网址| 老牛影视一区二区三区| 麻豆亚洲精品| 亚洲福利电影| 欧美1区3d| 亚洲欧洲在线观看| 欧美在线看片| 久久精品最新地址| 国产日韩欧美一二三区| 欧美中文字幕视频| 猛干欧美女孩| 亚洲经典三级| 欧美日韩亚洲高清一区二区| 一本色道久久综合亚洲精品婷婷| av成人国产| 国产精品狼人久久影院观看方式| 亚洲欧美日韩网| 久久综合婷婷| 亚洲精品在线一区二区| 欧美久久一区| 亚洲在线视频一区| 久久婷婷国产综合精品青草| 亚洲国产第一| 欧美日韩欧美一区二区| 亚洲免费在线| 免费在线成人| 亚洲视频1区2区| 国产一区二区三区在线免费观看| 久久亚裔精品欧美| 日韩小视频在线观看专区| 欧美一区二区三区免费在线看| 一区二区视频欧美| 欧美三级黄美女| 久久精品五月| 夜夜嗨av一区二区三区网页| 久久久久久噜噜噜久久久精品| 亚洲欧洲一区二区三区在线观看| 欧美午夜电影一区| 久久久无码精品亚洲日韩按摩| 亚洲国产精品va| 欧美一级淫片播放口| 亚洲经典三级| 国产亚洲一区二区三区在线观看| 欧美大片专区| 欧美一区二区视频在线| 亚洲精品美女免费| 久久影视三级福利片| 亚洲一区在线看| 91久久国产综合久久91精品网站| 国产精品捆绑调教| 欧美看片网站| 久久蜜臀精品av| 亚洲综合欧美日韩| 亚洲三级电影全部在线观看高清| 久久精品国产欧美激情| 一区二区三区鲁丝不卡| 亚洲国产一二三| 国产欧美一区二区精品性| 欧美日韩国产经典色站一区二区三区| 久久激情五月丁香伊人| 亚洲欧美日韩国产一区二区| 日韩一二在线观看| 亚洲国产一区在线观看|