我有一个二维数组:grid[x][y]
1 2 3 4 5 6 7 8
11 12 13 14 15 16 17 18
21 22 23 24 25 26 27 28
31 32 33 34 35 36 37 38
41 42 43 44 45 46 47 48
实施例: 我想将第3列向下移动,底部元素进入第一行,如下所示:
41 2 3 4 5 6 7 8
1 12 13 14 15 16 17 18
11 22 23 24 25 26 27 28
21 32 33 34 35 36 37 38
31 42 43 44 45 46 47 48
我使用以下函数左右移动整个数组,但在2d数组中,这显然不起作用,因为如果移动它,你必须将元素移动到另一个数组:
function wrap( t, l )
-- change i=0 to move left and i=1 to right
for i = 1, l do
table.insert( t, 1, table.remove( t, #t ) )
end
end
我在Lua暂存器中尝试过这个功能但是它没有工作......我无法在不丢失元素的情况下找出逻辑。
function shift( t, direction )
for i=1,#t do
if(direction == "left") then
if(i == 1) then
tempElement = t[#t][6]
else
tempElement = t[i-1][6]
end
else
if(i == 7) then
tempElement = t[1][6]
else
tempElement = t[i+1][6]
end
end
table.insert( t[i], 6, tempElement )
table.remove( t[i], 12)
end
end
如何将元素转移到另一列但相同的索引,因此grid[5][1]
进入grid[4][1]
,依此类推。
答案 0 :(得分:1)
根据您的评论,您正试图在列中移动项,例如:
{{11,12,13},
{21,22,23},
{31,32,33}}
到
{{31,12,13},
{11,22,23},
{21,32,33}}
以下代码使用了wrap函数:
g={{11,12,13},{21,22,23},{31,32,33}}
function shifItemWithinRow( array, shift )
shift = shift or 1 -- make second arg optional, defaults to 1
for i = 1, shift do
table.insert( array, 1, table.remove( array, #array ) )
end
end
function shifItemWithinColumn( grid, columnID, shiftCount )
shiftCount = shiftCount or 1 -- make second arg optional, defaults to 1
-- copy all items from g into new table, shifted:
local numRows = #grid
local newCol = {}
for i=1,numRows do --
local newI = i+shiftCount
if newI > numRows then newI = newI - numRows end
if newI < 1 then newI = numRows - newI end
newCol[newI] = grid[i][columnID]
end
-- copy all items into grid
for i=1,numRows do -- # each row
grid[i][columnID] = newCol[i]
end
end
function printGrid(g)
for i, t in ipairs(g) do
print('{' .. table.concat(t, ',') .. '}')
end
end
printGrid(g)
shifItemWithinColumn(g, 1) -- shift col 1 by +1
print()
printGrid(g)
print()
shifItemWithinColumn(g, 1, -1) -- shift col 1 by -1
printGrid(g)
此示例将列移动+1然后按-1(因此final与start相同)。