--[[
说明:该脚本的功能是把有序的一维数组转换成一维回形数组。
以3行5列为例
1.未转换的初始一维数组
local O = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
--
↓
01 → 04 →07 →10 →13
↓ / ↓ / ↓ / ↓ / ↓
02 / 05 / 08 / 11 / 14
↓ / ↓ / ↓ / ↓ / ↓
03/ 06/ 09/ 12/ 15
--
2.转换成标准的回形一维数组(可参考C语言实现回形数组的代码)
local P = {1,2,3,12,13,4,11,14,5,10,15,6,9,8,7}
--
↓
01 12 ← 11 ← 10 ← 09
↓ ↓ ↑
02 13 → 14 → 15 08
↓ ↑
03 → 04 → 05 → 06 → 07
--
3.结合1和2,转换成AR机器人回形码垛的一维回形数组
local N = {1,2,3,6,9,12,15,14,13,10,7,4,5,8,11}
]]--
function HuiXingPLT(Hang,Lie)
local Timer1 = os.clock() --计时开始
local c,i,j
local t,a=1,{}
--print("请输入回形矩阵的行和列:\n")
--Hang,Lie=io.read(),io.read()
local m,n=Lie,Hang
for i=1,m do --初始化回形矩阵
a[i]={}
for j=1,n do
a[i][j]=0
--print("a["..i.."]["..j.."]="..a[i][j])
end
end
--
if(m > n)then --列数 大于 行数
if(n%2 == 0)then c=n//2 else c=n//2+1 end
else
if(m%2 == 0)then c=m//2 else c=m//2+1 end
end
--print("c=",c)
for i=1,c,1 do
for j=i,n-i,1 do --输入当前行的数
a[i][j]=t
print("1-a["..i,"]["..j,"]="..t)
t = t + 1
end
--
for j=i,m-i,1 do --输入当前列的数
a[j][n-i+1]=t
print("2-a["..j,"]["..n-i+1,"]="..t)
t = t + 1
end
for j=n-i,i,-1 do
if(t <= m*n)then
a[m-i+1][j+1]=t --输入第m-i-1行的数
print("3-a["..m-i+1,"]["..j+1,"]="..t)
t = t + 1
end
end
for j=m-i,i,-1 do
if(t<=m*n)then
a[j+1][i]=t --输入第i列的数
print("4-a["..j+1,"]["..i,"]="..t)
t = t + 1
end
end
end
if(t-1<m*n)then --判断当输入行和列是奇数时最中心的那个数有没有输入,即最后一个数有没有输入
a[(m//2)+1][(n//2)+1] = m*n
end
--初始化原始的有序一维数组
local New,k2 = {},1
local Old = {}
for i=1,m*n do Old[i]=i print("Old["..i.."]="..Old[i]) end
--把多维数组合并成一维回形数组
for i=1,m,1 do
for j=1,n,1 do
print("a["..i.."]["..j.."]="..a[i][j])
New[k2] = a[i][j]
k2 = k2 + 1
--if(j%n==0)then
--print("\n")
--end
end
end
--把原始的一维有序数组和一维回形数组重新排列成新的一维回形数组
local w,N = 0,{}
for i = 1,Hang*Lie do
repeat w = w + 1 until New[w]==i
N[i] = Old[w]
w = 0
print("N["..i.."]="..N[i])
end
--
local Timer2 = os.clock() --计时结束
print("T:"..Timer2-Timer1.."s")
return N
end
local Hang,Lie = 3,5
_New = HuiXingPLT(Hang,Lie)
--得到_New = {1,2,3,6,9,12,15,14,13,10,7,4,5,8,11}