1

以下のような2次元配列の座標に基づく画像があるとしましょう:

{
        { ' ', ' ', ' ', ' ' }, 
        { ' ', ' ', 'x', ' ' }, 
        { ' ', 'x', ' ', ' ' }, 
        { ' ', 'x', 'x', ' ' }
};

次のような小さな配列に切り取りたいと思います:

{
        { ' ', 'x' }, 
        { 'x', ' ' }, 
        { 'x', 'x' }
};

どうすればいいですか?何か案は?

4

1 に答える 1

1

配列を 1 回繰り返します。

繰り返しながら、最も多くのleft列 (x最初に表示された列) と最も多くright(x最後に表示された列) を見つけます。2 行についても同じです。1 つは にtop、もう 1 つは にbottom。これらの 4 行は、画像の境界を示します。

              left right
        { ' ', ' ', ' ', ' ' }, 
 top    { ' ', ' ', 'x', ' ' }, 
        { ' ', 'x', ' ', ' ' }, 
 bottom { ' ', 'x', 'x', ' ' }

擬似コード:

int left = INT_MAX, right = -1, top = INT_MAX, bottom = -1
for (int y = 0; y < Y; y++)
  for (int x = 0; x < X; x++)
    if (t[x][y] == 'x')
    {
      if (left > x) left = x
      if (right < x) right = x
      if (top > y) top = y
      bottom = y // we don't need if! :)
    }

入力例を考えると、次のようなインデックスが生成されます。

left   == 1
right  == 2
top    == 1
bottom == 3

その境界を含む部分行列を取得すると、模範的な出力画像が得られます。

于 2013-10-03T12:26:08.330 に答える