2017-11-07 4 views
1

スドクグリッドのセルを指定したスドクブロックの開始点を取得する必要がある問題を解決しようとしています。例えばだからスドクブロックの座標の取得

このボードを与え:

2D-ARRAY COORDINATE 

[0,0] [0,1] [0,2] | [0,3] [0,4] [0,5] | [0,6] [0,7] [0,8] 
[1,0] [1,1] [1,2] | [1,3] [1,4] [1,5] | [1,6] [1,7] [1,8] 
[2,0] [2,1] [2,2] | [2,3] [2,4] [2,5] | [2,6] [2,7] [2,8] 
-------------------+---------------------+------------------- 
[3,0] [3,1] [3,2] | [3,3] [3,4] [3,5] | [3,6] [3,7] [3,8] 
[4,0] [4,1] [4,2] | [4,3] [4,4] [4,5] | [4,6] [4,7] [4,8] 
[5,0] [5,1] [5,2] | [5,3] [5,4] [5,5] | [5,6] [5,7] [5,8] 
-------------------+---------------------+------------------- 
[6,0] [6,1] [6,2] | [6,3] [6,4] [6,5] | [6,6] [6,7] [6,8] 
[7,0] [7,1] [7,2] | [7,3] [7,4] [7,5] | [7,6] [7,7] [7,8] 
[8,0] [8,1] [8,2] | [8,3] [8,4] [8,5] | [8,6] [8,7] [8,8] 

を所与のセルが[1,1]、関数はxについて0-2を返す必要がある場合

[X、Y]を仮定y値については0-2と同様に計算されます。 [0,3]の場合、x値の範囲では3〜5、y値の範囲では0〜2が返されます。

これは私が書いてきた機能である:

std::pair<int, int> getBlock(const double val) const { 
     double ourBlock = ceil(val/sqrt(size)); 
     int blockSize = sqrt(size); 
     int currBlock = 1; 
     int ourBlkStrt = 0; 
     for (int i = 0; i < size; i++) { 
      if (currBlock == ourBlock) { 
       if (currBlock > 1) { 
        ourBlkStrt = i + blockSize; 
       } else { 
        ourBlkStrt = i; 
       } 
       break; 
      } else { 
       if (i % blockSize == 0) { 
        currBlock++; 
       } 
      } 
     } 
     int ourBlkEnd = 0; 
     if (ourBlkStrt != 1) { 
     ourBlkEnd = ourBlkStrt + (blockSize); 
    } else { 
     ourBlkEnd = ourBlkStrt + (blockSize -1); 
    } 

     return std::pair<int, int>(ourBlkStrt, ourBlkEnd); 

    } 

私のコードはまさにそれを行うための最善の方法ではありません。それはほとんどの場合に機能しますが、時にはそれが私に必要な範囲外の値を与えます。

もっと良い方法がありますか?もしそうなら、誰かが私に方法を教えてもらえますか?

ありがとうございました。

+0

あなたの質問を編集してください。私はValgrindまたは類似のチェッカー内であなたの[mcve]を実行し、たとえばGDBなどのデバッガーで調査したと思います。完全なコンパイラ警告を有効にしたことを確認してください。ツールはあなたに何を伝えましたか、どの情報が欠落していますか? Eric Lippertの[小さなプログラムをデバッグする方法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を読んでください。 –

答えて

2

は、私たちはfを定義してみましょう:

std::pair<unsigned, unsigned> f(unsigned cell_index) 
{ 
    const unsigned block_index = cell_index/3; 
    const unsigned lowest_block_index = block_index * 3; 
    const unsigned highest_block_index = (block_index+1) * 3 - 1; 
    return { lowest_block_index, highest_block_index }; 
} 

または

std::pair<unsigned, unsigned> f(unsigned cell_index) 
{ 
    switch (cell_index) 
    { 
     case 0: return { 0, 2 }; 
     case 1: return { 3, 5 }; 
     case 2: return { 6, 8 }; 
    } 
    return { -1, -1 }; 
} 

あなたはそれをチェックすることもできます

f(0) == { 0, 2 }; 
f(1) == { 3, 5 }; 
f(2) == { 6, 8 }; 

その後、[y, x]として設計されたセルが[f(y).first, f(x).first]--[f(y).second, f(x).second]の範囲ました。

+1

また、 'constexpr std :: map > f = {{0、{0,2}}、{1、{3,5}}、{2、 6、8}}}; ' – YSC