2011-01-30 34 views
1

我想交換數組數組(即矩陣)中的行或列。我發現這個交換法網上,我用我的mutate功能,其中board.matrix是數組的數組擴展它:交換紅寶石矩陣中的列或行

# Swap to elements of an Array 
def swap!(a,b) 
    self[a], self[b] = self[b], self[a] 
    self 
end 

def mutate(board) 
    matrix = board.matrix 
    random = rand 
    rand_a = rand(matrix.length-1) 
    rand_b = rand(matrix.length-1) 

    puts "Old one:" 
    board.print_matrix 
    # We have a 50:50 chance of swapping either columns or rows 
    if random <= 0.5 
    # Swap columns: Transpose first 
    puts "Swapping columns #{rand_a} and #{rand_b}..." 
    temp = matrix.transpose 
    temp.swap!(rand_a, rand_b) 
    matrix = temp.transpose 
    else 
    # Just swap rows 
    puts "Swapping rows #{rand_a} and #{rand_b}..." 
    matrix.swap!(rand_a, rand_b) 
    end 
    puts "New one:" 
    board.print_matrix 
end 

現在它做什麼,它應該行:

Old one: 
X X 0 0 
0 0 0 0 
X X 0 0 
0 0 0 0 

Swapping rows 1 and 0... 
New one: 
0 0 0 0 
X X 0 0 
X X 0 0 
0 0 0 0 

但它不適用於列。這是爲什麼?

Old one: 
0 X X 0 
0 0 X 0 
X 0 0 0 
0 0 0 0 

Swapping columns 1 and 0... 
New one: 
0 X X 0 
0 0 X 0 
X 0 0 0 
0 0 0 0 

回答

2

因爲在下面的代碼,你沒有轉化matrix指向數組,你只需要分配一個新的數組來matrix,這是一個局部變量:

temp = matrix.transpose 
temp.swap!(rand_a, rand_b) 
matrix = temp.transpose 

實際上,你可以更換此代碼與此:

matrix.each do |row| 
    row[rand_a], row[rand_b] = row[rand_b], row[rand_a] 
end 
2

問題是,您只設置本地變量matrix到新o bject由#transpose創建。

然後你打印出原來的矩陣對象,顯然是board.matrix

雖然您也使用局部變量交換行,在這種情況下,本地是對原始對象的引用,所以它們是相同的,並且從輸出例程的角度來看它「工作」。但是對於列,transpose返回了一個新對象,而board從未更新過。