2

問題: 次のシーケンスを生成する必要があります。入力として行列の順序があります。

例:
その要素の位置のシーケンスを生成する必要があります。

 (0,0),(0,1),(1,0),(1,1) ->for order 2
 (0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2) -> for order 3.

これを行う機能が必要です。この関数を呼び出すと、その場で計算する必要があります。シーケンスをメモリに保存したくありません。

例えば:

first_call - > return value (0,0)
second_call to function - > return value ( 0,1)
...and so on...

これらの値をいくつかのグローバル変数に保存できます。

PS:
アプリケーションはマルチスレッドであるため、関数はスレッドセーフである必要があります。この条件に違いがないことはわかっています。問題全体を伝えたかっただけです。

精度:
ソリューションを試してみましたが、効率的ではないと思います。私はそれを行うための効率的な方法を探しています。手順について言及するだけです。特定の言語での実装は必要ありません。質問にさらに情報が必要な場合はお知らせください。

4

3 に答える 3

2

関数を呼び出した回数を格納するには、グローバル変数を使用します。それを呼び出しますt。次数がorderの場合、

f = ( tdiv ordertmod order)

divは整数除算 (例: 5 3 div= 1) で、modはモジュラス (除算の余り) です。(例: 5 mod3 = 2)。

たとえば、Javaでは次のようになります。

public class MyCounter {

    private static int t = 0;

    public static int[] myFunction(int order) {
        return new int[] { t / order , t++ % order };
    }

    public static void main(String[] args) {
        int order = 3;
        for(int i=0; i<order*order; i++) {
            int[] k = myFunction(order);            
            System.out.println("("+k[0]+", "+k[1]+")");
        }
    }
}
于 2012-09-28T17:29:20.907 に答える
0
#define MATRIX_ORDER 3

void NextPosition(int aIndex, int& aRow, int& aColumn)
{
    if (aColumn == MATRIX_ORDER - 1)
    {
        aRow++;
        aColumn = 0;
    } else {
        aColumn++;
    }
}


void SomeFunction()
{
    int index = 0;
    int row = 0;
    int column = -1;

    while (index < (MATRIX_ORDER * MATRIX_ORDER))
    {
        NextPosition(index, row, column);
        printf("index: %d, row: %d, column: %d\n", index, row, column);
        index++;
    }
}

出力:

index: 0, row: 0, column: 0
index: 1, row: 0, column: 1
index: 2, row: 0, column: 2
index: 3, row: 1, column: 0
index: 4, row: 1, column: 1
index: 5, row: 1, column: 2
index: 6, row: 2, column: 0
index: 7, row: 2, column: 1
index: 8, row: 2, column: 2
于 2012-09-28T17:35:36.257 に答える
0

ジェネレーターを使用した Python ソリューションは次のとおりです。

def sequence_gen(order=2):
    for i in range(order*order):
        yield divmod(i, order)


for val in sequence_gen(2):
    print(val)

#(0, 0)
#(0, 1)
#(1, 0)
#(1, 1)

for val in sequence_gen(3):
    print(val)

#(0, 0)
#(0, 1)
#(0, 2)
#(1, 0)
#(1, 1)
#(1, 2)
#(2, 0)
#(2, 1)
#(2, 2)
于 2012-09-28T19:17:01.203 に答える