1

* n行列と値kが与えられた場合、各要素のすべての近傍をどのように見つけるのでしょうか。例:4*4行列では、k=2 たとえば行列は:

[ 1  2  3  4
  5  6  7  8
  9 10 11 12
 13 14 15 16]

ここで、これらの値は場所のインデックスであり、のネイバーです1 are 1,2,3,5,6,9。値3,6 and 9は、k = 2であるためにのみ取得され、kが=1の場合は存在しません。

同様に、6の隣人は1 2 3 5 6 7 8 9 10 11 and 14

これをC++で実装するためのACコードを書くのを手伝ってくれませんか。

これはフォンノイマン近傍の問題です。誰かがc++で実装できますか。ありがとう

4

2 に答える 2

1

あなたの隣人はあなたのターゲット要素の周りにひし形のパターンを形成します。ひし形のポイントは、ターゲット要素からkホップ離れています。したがって、上はk行上、左はk列上などになります。レベルからレベルに移動すると、ひし形が均一に拡大します。一番上のポイントから開始して、1行下(ターゲットノードに近い)に移動すると、各側に1つずつ移動します。他の方向には対称です。言い換えると、隣接ノードとターゲットノード間のx座標の差に、yの差を加えたものが<=kになります。

したがって、このダイアモンドを反復処理する2つのネストされたforループを作成するだけです。外側のループは行を繰り返し、内側のループは列を繰り返します。上部から開始し、ターゲット要素と同じ行に到達するまで外側のループの反復ごとにダイアモンドを1ずつ拡張し、下部のポイントに到達するまで縮小します。明らかに、マトリックスの外側に出るための境界条件をテストする必要があります。

于 2011-05-16T07:27:47.233 に答える
0

これは、k=1のトリックを実行する必要があります。すべてのkで機能するように小さな変更を加えます

int width = 4;
int height = 4;
int k = 1;
int value = 2;

bool hasRight = (value % width != 0);
bool hasLeft = (value % width != 1);
bool hasTop = (value > 4);
bool hasBottom = (value < (height * width - width));

cout << value;  // Always itself
if(hasRight == true) {
 cout << value+1 << " ";  // Right
 if(hasTop == true) {
  cout << value-width << " " << value-width+1 << " "; // Top and Top-right
 }
 if(hasBottom == true) {
  cout << value+width << " " << value+width+1; // Bottom and Bottom-right
 }
}

if(hasLeft == true) {
 cout << value-1 << " ";  // Left
 if(hasTop == true) {
  cout << value-width-1 << " ";  // Top-left
 }
 if(hasBottom == true) {
  cout << value+width-1 << " ";  // Bottom-left
 }
}
于 2011-05-16T07:32:37.737 に答える