用lua編寫的求五邊形數目的程式
原題見這裡 ,把原一維陣列下標a[x*10+y],改為二維陣列a[x][y]修改後,能適應不同大小的圖案.同時修正了變數比較型別不匹配問題。
function a(s1) --返回最小數開頭的序列,如果反方向的第2個數比正方向更小,則返回反方向的序列 st=1 --start pos minx=1000 minp=1 xa={} for i=1,100 do --find times is unknown pos=string.find(s1,',',st) if pos ~= nil then x=tonumber(string.sub(s1,st,pos-1)) else x=tonumber(string.sub(s1,st)) end xa[#xa+1]=x --print (i,x,st,pos) if x<minx then minx=x minp=st minidx=#xa end if pos==nil then break end st=pos+1 end if minp==1 then s2=s1 else s2=string.sub(s1,minp)..','..string.sub(s1,1,minp-2) end --print(xa[minidx]) if xa[minidx%#xa+1]<xa[(minidx-2+#xa)%#xa+1] then return s2 else s3=tostring(minx) for i=1,#xa-1 do s3=s3..','..tostring(xa[(minidx-1-i+#xa)%#xa+1]) --print(xa[(minidx-1-i+#xa)%#xa+1]) end return s3 end end R,C,T,W={},{},{},{} --table define id=0 -- for small figure --[[ for r=1,4 do for c=1,3 do if r+c <=5 then id=id+1 R[id],C[id],T[id],W[id]=r,c,r+c-1,(1<<id); --assign --print(id,R[id],C[id],T[id],W[id]) end end end ]] --for big figure for r=1,5 do for c=1,5 do if r+c>=4 and r+c <=8 and r*1000+c~=1003 and r*1000+c~=3005 then --{r,c}~={1,3} and {r,c}~={3,5}then id=id+1 R[id],C[id],T[id],W[id]=r,c,r+c-1,(1<<id); --assign print(id,R[id],C[id],T[id],W[id]) end end end PW,D={},{} for i=1,id do PW[i],D[i]={},{} end for s=1,id do --start for e=1,id do --end for m=1,id do --mid if s~=e and (R[s]==R[e] or C[s]==C[e] or T[s]==T[e]) then if R[s]==R[e] then D[s][e]=1 elseif C[s]==C[e] then D[s][e]=2 else D[s][e]=3 end D[e][s]=D[s][e] if (R[s]==R[e] and C[e]-C[s]>1 and R[m]==R[s] and C[m]>C[s] and C[m]<C[e]) or (C[s]==C[e] and R[e]-R[s]>1 and C[m]==C[s] and R[m]>R[s] and R[m]<R[e]) or (T[s]==T[e] and R[e]-R[s]>1 and T[m]==T[s] and R[m]>R[s] and R[m]<R[e]) then if PW[s][e]==nil then PW[s][e]=(1<<m) else PW[s][e]=PW[s][e]+(1<<m); end PW[e][s]=PW[s][e] end end end end end Path,SW,P,D1,D2={},{},{},{},{} print('***1***') v=1 Path[1],SW[1],P[1],D1[1],D2[1]={},{},{},{},{} for i=1,id do --1st point Path[1][i]=''..i SW[1][i]=W[i] P[1][i]=i D1[1][i]=0 D2[1][i]=0 print(Path[v][i],SW[v][i],P[v][i],D1[v][i],D2[v][i]) end cnt5=0 for v=2,5 do --2nd to 5th points print('***'..v..'***') cnt=0 Path[v],SW[v],P[v],D1[v],D2[v]={},{},{},{},{} for k=1,#P[v-1] do -- prior level's point for i=1,id do --new/this point pt=P[v-1][k] --prior point if pt~=i and(R[pt]==R[i] or C[pt]==C[i] or T[pt]==T[i]) then --2 points must be a pair wt=W[i] if PW[pt][i]~=nil then wt=wt+PW[pt][i] end if (SW[v-1][k] & wt)==0 and D[pt][i]~=D1[v-1][k] then --2 points must be a pair,so D ~= nil cnt=cnt+1 Path[v][cnt]=Path[v-1][k]..','..i SW[v][cnt]=SW[v-1][k]+wt P[v][cnt]=i D1[v][cnt]=D[pt][i] D2[v][cnt]=D2[v-1][k]*10+D1[v][cnt] if v==5 then st=tonumber(string.sub(Path[v][cnt],1,string.find(Path[v][cnt],',')-1)) --st start point if D[i][st]~=nil and D[i][st]~=tonumber(string.sub(D2[v][cnt],1,1)) and D[i][st]~=D1[v][cnt] and(PW[i][st]== nil or (SW[v][cnt]&PW[i][st])==0 ) and a(Path[v][cnt])==Path[v][cnt] then print(Path[v][cnt],SW[v][cnt],P[v][cnt],D1[v][cnt],D2[v][cnt]) cnt5=cnt5+1 end end end end end end end print(cnt5,"個不同的五邊形")
相關文章
- 尤拉五邊形數定理小記
- 編寫高效能的 Lua 程式碼
- 一個用lua編寫的自定義函式函式
- OpenRTMFP/Cumulus Primer(2)用Lua編寫HelloWorld應用擴充套件CumulusServer套件Server
- 編寫一個程式求輸入字串的長度字串
- 如何利用CSS寫一個六邊形?CSS
- 使用Lua編寫可嵌入式指令碼指令碼
- 編寫友好的命令列應用程式命令列
- 用jQuery編寫出更好的程式碼jQuery
- 用Delphi編寫DelTree程式 (轉)
- 用PHP編寫Android應用程式PHPAndroid
- C++ Builder 高手進階 (五)用BCB編寫多執行緒應用程式 (轉)C++UI執行緒
- 微信小程式-測試遊戲生成六邊多邊形微信小程式遊戲
- 邊學邊寫——母函式及其在中學數學競賽中的運用(一)函式
- 用VC++編寫CGI程式 (轉)C++
- 用VB編寫抽獎程式 (轉)
- 卡特蘭數關於凸多邊形的證明
- [譯] 用 API 請求製作賞心悅目的 UXAPIUX
- iOS 編寫高質量Objective-C程式碼(五)iOSObjectC程式
- canvas實現的多邊形程式碼例項Canvas
- 基於 Lua 寫一個爬蟲程式爬蟲
- 用Rust編寫的快如閃電的程式碼編輯器:lapceRust
- 六邊形架構教程:構建可維護的Web應用程式 - DEV架構Webdev
- css六邊形效果程式碼例項CSS
- 邊寫 Javascript 程式碼邊玩遊戲 – WarriorJSJavaScript遊戲JS
- 編寫Linux實用程式的藝術(轉)Linux
- 小白也能操作Linux,十分鐘教你簡單的shell指令碼編寫邊學邊用Linux指令碼
- Vue3,用組合編寫更好的程式碼:靈活的引數(2/5)Vue
- 用mingw編譯lua5.3原始碼編譯原始碼
- 如何學習用Java編寫程式碼?Java
- 用Delphi編寫安裝程式(1) (轉)
- 編寫iOS應用程式有何不同iOS
- 用VB編寫標準CGI程式 (轉)
- 用 C++Builder 編寫 Tray 程式 (轉)C++UI
- 用QT在Windows下編寫dll程式QTWindows
- lua學習: lua及函數語言程式設計語言函數程式設計
- 六邊形RecyclerViewView
- 拖拽編寫SVG圖形化工具(二)SVG