0

非常に高速な nqueens プログラムを作成するという課題があります。これまでのところ、ブルートフォース アルゴリズムとバックトラックは機能していますが、より高速と思われる C プログラムを見つけました。CからJavaに変換しようとしましたが、ポインターで何が起こっているのか理解していないため、ポインターを変換できません。変換する必要がある行は次のとおりです。

編集:私が理解しているものに変換を更新しました:

final int[] aStack = new int[MAX_BOARDSIZE * 2];
int bitfield; //That's what I've got so far


//Conversion 1:
register int* pnStack;       -> int pnStack;

//Conversion 2:
pnStack = aStack + 1;        -> pnStack = 1;

//Conversion 3:
pnStack = aStack + 1;        -> pnStack = 1;
*pnStack++ = 0;              -> aStack[pnStack++] = 0;

//Conversion 4:
bitfield = *--pnStack;       -> bitfield = aStack[--pnStack];

//Conversion 5:
*pnStack++ = bitfield;       -> aStack[pnStack++] = bitfield;

//Conversion 7:
pnStack == aStack            -> pnStack == aStack[0] ???????

解決策があればいいのですが、ここで何が起こっているのか説明していただければ、自分で見つけようとします。ポインターは、私が実際に c と c++ を学んだことがない理由です。

よろしく、デニス・フィッシャー

4

1 に答える 1

2

配列内では、配列内でインデックスを使用するのと同じようにポインターを解釈します。

*は、インデックスの現在位置の値を意味します。

そう

pnStack = aStack;  <-- int pnStack = 0;
pnStack++;         <-- pnStack++;
bitfield = *pnStack <-- bitfield = aStack[pnStack];
bitfield = *--pnStack <-- bitfield = aStack[--pnStack]; (first decrement index, then retrieve the value)
于 2012-12-04T10:43:21.597 に答える