"flood fill"やA *のようなパス探索アルゴリズムに似た何らかのアルゴリズムを使用します。左上隅(値1)から開始し、それを出力し、右と下に「展開」して、その値(2と5)をリストに追加します。これらの両方とも1より大きいでしょう。あなたのリスト(値2)から最小の値を出力し、それを "展開"してください。リストに4と7が追加され、4が出力され、それを「展開」します。ソートされたリストを維持することによって、あなたは出力最小の要素が瞬時にして一度も(f.e. 10,11,12)で連続した値の出力、複数の「実行」することができるかもしれないことを
は
注意。だから、擬似コードは次のようになります。
// array a[y][x]
// list L - ordered insertion, additionally stores matrix indices of values
add a[0][0] to L
loop until L is empty
output first element of L
remove first element of L and add its right and bottom neighbors (if any) to L
loop end
編集:ここで働いCの実装です。
#include <stdio.h>
#include <stdlib.h>
#define COLS 5
#define ROWS 4
int matrix[ROWS][COLS] = {
1, 5, 10, 15, 20,
2, 7, 12, 17, 22,
4, 9, 18, 25, 28,
11, 14, 21, 26, 31
};
struct entry {
int value;
int x, y;
};
entry list[ROWS+COLS]; // Not sure how big the list can get, but this should be enough
int list_len = 0;
void set_list_entry(int index, int value, int x, int y) {
list[index].value = value;
list[index].x = x;
list[index].y = y;
}
void add_to_list(int x, int y) {
int val = matrix[y][x];
int i, pos = list_len;
for (i = 0; i < list_len; i++) {
if (list[i].value == val) return; // Don't add value that is on the list already
if (list[i].value > val) {
pos = i;
break;
}
}
// Shift the elements after pos
for (i = list_len + 1; i > pos; i--) {
set_list_entry(i, list[i - 1].value, list[i - 1].x, list[i - 1].y);
}
// Insert new entry
set_list_entry(pos, val, x, y);
list_len++;
}
int main() {
int iteration = 0;
add_to_list(0,0);
do {
// output first element of list
printf("%i ", list[0].value);
iteration++;
if ((iteration % COLS) == 0) printf("\n");
// add neighbors of first element of list to the list
if (list[0].x < (COLS - 1)) add_to_list(list[0].x + 1, list[0].y);
if (list[0].y < (ROWS - 1)) add_to_list(list[0].x, list[0].y + 1);
// remove first element of list
for (int i = 0; i < list_len; i++) {
set_list_entry(i, list[i + 1].value, list[i + 1].x, list[i + 1].y);
}
list_len--;
} while (list_len > 0);
return 0;
}
リストの長さに関するコメントに注意してください。私は、リストを取得することができますどのように大きなわからないんだけど、私はCOLS+ROWS
はこの最悪のケースを見て十分なはずだと思う:
1 3 5 7 9 ..
2 y y y y
4 y x x x
6 y x x x
8 y x x x
.
.
すべての「国境」の要素が最小y
値未満であれば、あなたが買ってあげますプロセス内のy
値の完全なリスト。(ROWS - 1) + (COLS - 1)
要素です。
は、このような最悪のケースを見て、私は、これが最も効率的な解決策ではないと思いますが、私はそれはそれにもかかわらず、エレガントかつ簡潔な一つだと思います。
C++またはCのいずれかを選択してください。C++では、非常に大きな標準ライブラリ(またはBoost)を活用することができますので、答えは大きく異なります。 –
もし私が具体的に質問すれば、私はCのために行くでしょう。 – Aiden