我是用下面的問題玩耍的右下角方式號碼:從左上角到一個數組
鑑於2 d陣列找到所有我們可以從頂部 左上角單元格移動的可能途徑
[0][0]
到底部右側單元格[N-1][N-1]
因爲我們 只能向下或向右移動?
我定義以下:
對於數組如[ [ 1 ] ]
只有1路從開始小區到目的地小區去。我們已經在那裏。
否則它的方式總數是我們從小區到目的地的方式總數加1(從當前小區到下一個小區有1種方式)再加上我們的總數從細胞波紋管到目標加1去(存在從當前小區到去到波紋管單元1點的方式)
所以對於陣列如:
[
[1, 2]
[3, 4]
]
答案是4(1-> 2→2→4,1→3→3→4)。
對於數組如:
[
[1, 2, 3],
[3, 4, 5],
]
答案應該是8。4來自子陣列向右+ 1去(1) - >(2)加1-> 3 3-> 4 4-> 5共3.
所以5 + 3 = 7.
下面的代碼在我看來是正確的,但我搞砸了一些東西,我得到了錯誤的結果。
my $array = [
[1, 2, 3],
[3, 4, 5],
];
sub number_of_ways {
my ($input, $source_row, $source_col, $dest_row, $dest_col) = @_;
if ($source_row == $dest_row && $source_col == $dest_col) {
return 1;
}
if ($source_row >= scalar @$input) {
return 0;
}
if ($source_col >= scalar @{$input->[$source_row]}) {
return 0;
}
my $ways_down = number_of_ways($input, $source_row + 1, $source_col, $dest_row, $dest_col);
my $ways_right = number_of_ways($input, $source_row, $source_col + 1, $dest_row, $dest_col);
my $total = $ways_right + 1 if ($ways_right);
$total += $ways_down + 1 if ($ways_down);
return $total;
}
print "Number of ways: " . number_of_ways($array, 0, 0, 1, 2). "\n";
這給我11
是邏輯錯誤?
更新:
在@ m69的幫助下,我發現了問題。
如果我們已經可以檢查它是否會失敗,那麼在遞歸中進行迭代是一個壞主意。在這種情況下,即使在@ m69的註釋之後更改代碼之後,它仍然失敗,因爲0之間沒有區別,因爲我們位於具有1個元素的子數組中(源和目標相同)或數組外部。
以下代碼似乎是正確的。
sub number_of_ways {
my ($input, $source_row, $source_col, $dest_row, $dest_col) = @_;
if ($source_row == $dest_row && $source_col == $dest_col) {
return 0;
}
my $total = 0;
if ($source_row < @$input - 1) {
my $ways_down = number_of_ways($input, $source_row + 1, $source_col, $dest_row, $dest_col);
$total += $ways_down + 1;
}
if ($source_col < @{$input->[$source_row]} - 1) {
my $ways_right = number_of_ways($input, $source_row, $source_col + 1, $dest_row, $dest_col);
$total += $ways_right + 1;
}
return $total;
}
print "Number of ways: " . number_of_ways($array, 0, 0, 1, 2). "\n";
可以請您給我解釋一下如何爲陣'[ [1,2], [3,4] ]'答案是4。因爲我認爲從(0,0)到(1,1)有兩種方法,一種是(1-> 2,2-> 4),另一種是(1-> 3,3-> 4)'。有我錯東西 – Debabrata
@Debabrata:'[0] [0] - > [0] [1] + [0] [1] - > [1] [1] + [0] [0] - > [1] [0] + [1] [0] - > [1] [1] = 4 =(1 - > 2)+(2 - > 4)+(1-> 3)+(3-> 4)' – Jim
@Debabrata:你正在計算路徑。我正在計算不同的步驟 – Jim