2015-03-05 2 views
-1

Внутри массивов у меня есть 0 и один 1.Изменяемые элементы в многомерном массиве

class Image 
    def initialize(rows) 
    @rows = rows 
    end 
end 

image = Image.new([ 
    [0, 0, 0, 0], 
    [0, 0, 0, 0], 
    [0, 0, 0, 0], 
    [0, 1, 0, 0], 
    [0, 0, 0, 0], 
    [0, 0, 0, 0], 
]) 

Я хочу, чтобы номер, которые расположены вверх, вниз, влево и вправо, чтобы повернуть 1, а также. Я попытался сделать это, манипулируя column_index и row_index. Код:

class Image 
    def blur 
    @rows_copy = Array.new(@rows.size) {Array.new(@rows.first.size)} 
    @rows.each_with_index do |row, row_index| 
     row.each_with_index do |cell, column_index| 
     blur_location(row_index,column_index) 
     end 
    end 
    @rows = @rows_copy 
    end 
    def blur_location (row_index, column_index) 
    if @rows[row_index][column_index] == 1 
     @rows_copy[row_index][column_index] = 1 
     @rows_copy[row_index + 1][column_index] = 1 
     @rows_copy[row_index - 1][column_index] = 1 
     @rows_copy[row_index][column_index + 1] = 1 
     @rows_copy[row_index][column_index - 1] = 1 
    else 
     @rows_copy[row_index][column_index] = 0 
    end 
    end 
    def output_image 
    @rows.each_with_index do |row, row_index| 
     puts row.join('') 
    end 
    end 
end 

image.blur 
image.output_image 

Но только половина кода работает (то есть, верхний и левый поворачивается к 1, но не другие два).

+0

Этот вопрос [спросил недавно] (http://stackoverflow.com/questions/28777194/two-dimensional-array-with-ruby/28777829#28777829). Я думаю, что использование класса [Матрица] (http://ruby-doc.org//stdlib-2.2.0/libdoc/matrix/rdoc/Matrix.html) - это путь, но не все согласятся. –

ответ

1

код работает почти как ожидалось, но вы жертва следующий кусок кода:

else 
    @rows_copy[row_index][column_index] = 0 
end 

Что происходит это, когда вы попали в «1» вы установите все, как и ожидалось, но при перемещении и вы нажмете нули, которые находятся рядом с «1» (вправо и вниз по мере обработки) вы сбросите rows_copy на ноль.

Вот пересмотренная версия кода НОО правильно (обратите внимание, как копия все первый набор в 0, а после этого только 1s отмечены):

#!/usr/bin/env ruby 

class Image 
    def initialize(rows) 
    @rows = rows 
    end 

    def blur 
    @rows_copy = Array.new(@rows.size) {Array.new(@rows.first.size)} 
    @rows.each_with_index do |row, row_index| 
     row.each_with_index do |cell, column_index| 
     set_zero(row_index,column_index) 
     end 
    end 
    @rows.each_with_index do |row, row_index| 
     row.each_with_index do |cell, column_index| 
     blur_location(row_index,column_index) 
     end 
    end 
    @rows = @rows_copy 
    end 
    def set_zero(row_index, column_index) 
    @rows_copy[row_index][column_index] = 0 
    end 
    def blur_location (row_index, column_index) 
    if @rows[row_index][column_index] == 1 
     @rows_copy[row_index][column_index] = 1 
     @rows_copy[row_index + 1][column_index] = 1 
     @rows_copy[row_index - 1][column_index] = 1 
     @rows_copy[row_index][column_index + 1] = 1 
     @rows_copy[row_index][column_index - 1] = 1 
    end 
    end 
    def output_image 
    @rows.each_with_index do |row, row_index| 
     puts row.join('') 
    end 
    end 
end 

image = Image.new([ 
    [0, 0, 0, 0], 
    [0, 0, 0, 0], 
    [0, 0, 0, 0], 
    [0, 1, 0, 0], 
    [0, 0, 0, 0], 
    [0, 0, 0, 0], 
]) 

image.blur 
image.output_image 
+0

Отличный ответ! СПАСИБО! –

Смежные вопросы