私は、奇数の位置nのすべての点が位置(n-1)の点の前に出現できないという制限でJavaの点の集合を置換しようとしています。すなわち、2点1と2を与えられたとき、 1,2,3 & 4順列と与えられたポイントのいずれかで、予想される順列のセットは、次のとおりです。制限付きポイントセットをどのように並べ替えますか?
static void permute(int[] a, int k,int[] p) {
if (k == a.length) {
for (int i = 0; i < a.length; i++) {
System.out.print(" " + a[i]);
}
System.out.println();
}
else {
int temp;
for (int i = k; i < a.length; i++) {
if(i % 2 == 0){
temp = a[k];
a[k] = a[i];
a[i] = temp;
permute(a, k + 1,p);
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
else{
if(k > p[i]){
temp = a[k];
a[k] = a[i];
a[i] = temp;
permute(a, k + 1,p);
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
}
}
}
が、私の現在:
1,2,3,4
1,3,2,4
1,3,4,2
3,1,2,4
3,4,1,2
3,1,4,2
私は現在、順列を見つけるための次のコードを持っています出力は:
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 3 2
1 4 2 3
3 2 1 4
3 2 4 1
3 1 2 4
3 1 4 2
3 4 1 2
3 4 2 1
助けが本当にありがとうございます:-)
この種の演習は十分に文書化されており、バックトラックを適用することですべて解決されます。このhttp://www.fas.harvard.edu/~cscie119/lectures/recursion.pdfを見ると、18ページのバックトラッキングアルゴリズムのテンプレートがすべて同じように見えます。より一般化されたバージョンは、ノード内のデータをラップして、再利用を容易にします。 –
ルールをより正確に説明できますか? '奇数位置nのすべての点が位置(n-1)の点の前に表示されない場合、どのように奇数位置(3)にある3が2の前に表示されるのですか?あなたの例が数字1,2,3,4を持っているならば、1,2,3,4? – MrSmith42
@ MrSmith42:彼は "偶数"を意味していたでしょうか?1の前に2が出現せず、3は4の前に出ることはできません。 –