問題の説明: いくつかの入力nから上に行くすべてのシーケンスの数を計算します。 したがって、ユーザーはnを入力します。それとnは、私は数字の1..nの配列を作成し、そのプロパティでシーケンスに番号をアップ/ダウンシーケンスを交互にカウントする
例:n = 4
1 3 2 4
1 4 2 3
2 3 1 4
2 4 1 3
3 4 1 2
回答:5
私のプログラムは動作しますが、何らかの理由私は時々答えの代わりに0を得る。あなたは(n、k)はkはあなたのシーケンスの最後の数であると長さnのアップダウンシーケンスの数のタブを呼び出す場合
#include <stdio.h>
#include <stdlib.h>
void *safeMalloc(int n) {
void *p = malloc(n);
if (p == NULL) {
printf("Error: malloc(%d) failed. Out of memory?\n", n);
exit(EXIT_FAILURE);
}
return p;
}
void swap(int *fir, int *sec) {
int temp = *fir;
*fir = *sec;
*sec = temp;
}
void permute(int *array, int i, int length, int *count) {
if (length == 2) {
*count = 1;
return;
}
if (length == i) {
int v = 0, flag = 1;
while (v < length) {
if (v % 2 == 0) {
if (array[v] < array[v + 1]) {
v++;
} else {
flag = 0;
return;
}
}
if (v % 2 != 0) {
if (array[v] > array[v + 1]) {
v++;
} else {
flag = 0;
return;
}
}
}
if (flag == 1) {
/*
int a;
for (a = 0; a < length; a++)
printf("%d", array[a]);
printf("\n");
*/
*count = *count + 1;
}
}
int j = i;
for (j = i; j < length; j++) {
swap(array + i, array + j);
permute(array, i + 1, length, count);
swap(array + i, array + j);
}
return;
}
int main(int argc, char **argv) {
int n;
scanf("%d", &n);
int *arr = safeMalloc(n * sizeof(int));
int i;
for (i = 0; i < n; i++) {
arr[i] = i + 1;
}
int count = 0;
permute(arr, 0, n, &count);
printf("%d\n", count);
return 0;
}
「行く」とはどういう意味ですか? – MBo
「何か入力から何が起きたか」という意味は明確ではないのですか? 'a_1 ... a_k a_ {k + 1} ... a_n'というシーケンスが' a_1 ... a_k'でソートされたシーケンス、 'a_ {k + 1} ...a_nは再びソートされますが、 'a_k> a_ {k + 1}'はソートされます。順列はどこで始まるのですか?また、 'safeMalloc'の代わりに普通の' malloc'を使うだけで安全です。メモリが足りなくなることはまずありません。ほとんどの設定で、 'malloc'がNULLを返すよりも早くOOMが殺されることになります。 –
例を見てください:1 <3> 2 <4。私が上を向いていることは、偶数の位置にある数字が常に隣の奇数よりも小さいことです。 –