2017-02-13 3 views
-2

2次元マトリックスでは、それぞれのIDの方向によって1つの直接接続された隣人を見つけたいと思います。2D行列で直接接続された隣人を見つけるにはどうすればいいですか?

私は何を意味:
X0 = X
Y0 = Y1
X1 = X + 1
Y1 = Y
×2 = X
Y2 = Y + 1
×3 = X - 1
Y3 = Y

又はグラフィックとして:

 ╔═══════╗ 
     ║ N ║ 
     ║ x,y-1 ║ 
     ║  ║ 
╔═══════╬═══════╬═══════╗ 
║ W ║  ║ E ║ 
║ x-1,y ║ x,y ║ x+1,y ║ 
║  ║  ║  ║ 
╚═══════╬═══════╬═══════╝ 
     ║ S ║ 
     ║ x,y+1 ║ 
     ║  ║ 
     ╚═══════╝ 
何年か前

私は同じ問題を抱えていたし、非常に向上させることができた醜いスイッチケースとそれを解決し、プログラミング始めた:

if (mode == 'Y'){ 

    switch(direction){ 
     case 1: 
      return -1; 
     case 2: 
      return 0; 
     case 3: 
      return 1; 
     case 4: 
      return 0; 
     default: 
      break; 
    } 
} 

if (mode == 'X'){ 

    switch(direction){ 
     case 1: 
      return 0; 
     case 2: 
      return 1; 
     case 3: 
      return 0; 
     case 4: 
      return -1; 
     default: 
      break; 
    } 
} 

セルは、yのxは、単一の式でアクセスする必要がありますと方向(N、E、S、W、 0-3)

周囲のスペース(x-1、y-1からx + 1、y + 1)を定義するなど、すべてのネイバーを持つことは望ましくありません。これはちょうど繰り返すだけで、正方形を投げたので、親切なものになるでしょう。私はちょうど単一の細胞が欲しい。

これは音のようなものですが、シンプルですが、短く、速く、合法的な解決策を見つけることに頭が痛いです。優先言語はC++

私はあなたの解決策に興奮しています!

EDIT

私は今、問題を考え出しました。

はこれを見てみましょう: Graph

悲しいイムまだ画像を投稿することができますが、あなたが方向を表す定数を持つグラフの交点を見ることができるようにxと座標に追加する必要が正確に何ではありません

x1 = x + cos((2*pi*(dir-1))/4) 
y1 = y + cos((2*pi*(dir-2))/4) 

dirは0から3にある間:あなたは私たちがY取得するための単純な正弦波を使用することができ、これから式があることを、これは意味

の上に見ることができます

私の解決策は、接続された隣人を計算する純粋な数学的方法を見つけることです。もちろん、これは何らかの形で改善される可能性がありますか?

あなたのソリューションをありがとう!この問題の解決策を楽しみにしています!

乾杯!

+0

はSOへようこそ!現在のソリューションの問題点と、「適切な」ソリューションと考えるべき点について説明してください。 –

+0

トピックを外しています: "x、y、方向(N、E、S、W、0-3など)を持つ単一の式でセルにアクセスできるようにする必要があります"素敵で読みやすい名前。 – user4581301

答えて

0

配列の使用を検討しましたか?例えば、

int goY[] = {-1,0,1,0};  
int goX[] = {0,1,0,-1}; 

x += goX[direction]; 
y += goY[direction]; 

またはあなたのコードは次のようになりますmode

int move[2][4] = 
{ 
    {-1,0,1,0},  
    {0,1,0,-1} 
}; 

を組み込む:

loc += move[mode - 'x'][direction]; 

が、私はあなたが完全にmodeと離れて行うことができます疑い。私はあなたが例えば "forループ" 2と

それを解決することができると思い

0

for (cx = -1; cx <= 1; cx++) { 
    for (cy = -1; cy <= 1; cy++) { 
     // All neighbors (N, NE, E, SE, S, SW, W, NW) 
     if (1 == abs(cx - cy)) { 
      // directneighbors (N, E, S, W) 
     } 
    } 
} 
関連する問題