保存所有排列

时间:2016-12-29 13:12:02

标签: c

我想编写一个函数来生成数字的所有排列并将它们存储到2D数组中。我知道如何使用递归方法打印出给定数字的所有排列,但我无法弄清楚如何将每个排列保存到数组中。

void permute(int *arr, int left, int right, int **per, int rows)
{
int k = 0, j;

if(left == right)
{
    for(j = 0; j <= right; j++)
        printf("%d ", arr[j]);
    printf("\n");
    /*(for(j = 0; j <= right; j++)
    {
        per[k][j] = arr[j];
        k++;
        if(k == rows)
        eturn;
    }*/
}
for(j = left; j <= right; j++)
{
    swap(arr + left, arr + j);
    permute(arr, left + 1, right, per, rows);
    swap(arr + left, arr + j);
}
}

int main(void)
{
int a[3], i, j, **b;

for(i = 0; i < 3; i++)
    a[i] = i;
b = malloc(4 * sizeof(int *));
for(i = 0; i < 4; i++)
    b[i] = malloc(3 * sizeof(int));
permute(a, 0, 2, b, 4);
for(i = 0; i < 4; i++)
{
    printf("\n");
    for(j = 0; j < 3; j++)
        printf("%d ", b[i][j]);
}
printf("\n");
return 0;

}

因此,例如,此代码将打印出0123的排列。我希望b(2D数组)保存前4个生成的排列。我的意思是0123的排列是:

0 1 2 |
0 2 1 |
1 0 2 |
1 2 0 |
2 1 0 |
2 0 1

和b(2D数组)有:

2 0 1 |
0 0 0 |
0 0 0 |
0 0 0 |

2 个答案:

答案 0 :(得分:1)

首先,看看你的permute()功能:

void permute(int *arr, int left, int right, int **per, int rows)

前三个参数是跟踪排列本身所必需的。最后两个参数是用于存储排列的数组,以及该数组中的行数。缺少的是另一个int告诉函数已经填充了多少行,所以让我们添加:

void permute(int *arr, int left, int right, int **per, int rows, int rows_filled)

main(),您只需致电permute(a, 0, 2, b, 4, 0)。在permute()本身,您现在知道数组中必须写入结果的位置:

if(rows_filled < rows) {
  for(j = 0; j <= right; j++)
    per[rows_filled][j] = arr[j];
  rows_filled++;
}

答案 1 :(得分:0)

您需要一种方法来跟踪当前填充的行数。而且您还需要一种方法来增加数字,以便permute的所有调用都可以看到它。

因此,我建议您使用int*扩展该函数,该permute指向“下一行要填充”。通过使用指针,您可以将它指向的整数从#include <stdio.h> #include <stdlib.h> void swap(int*a, int* b) { int temp = *a; *a = *b; *b = temp; } void permute(int *arr, int left, int right, int **per, int* pRow, int rows) { int j; if(left == right) { for(j = 0; j <= right; j++) { printf("%d ", arr[j]); } printf("\n"); if (*pRow < rows) // Check for free rows { for(j = 0; j <= right; j++) { per[*pRow][j] = arr[j]; // Fill the row } ++(*pRow); // Increment row-to-be-filled } } for(j = left; j <= right; j++) { swap(arr + left, arr + j); permute(arr, left + 1, right, per, pRow, rows); swap(arr + left, arr + j); } } int main(void) { int a[3], i, j, **b; for(i = 0; i < 3; i++) a[i] = i; b = malloc(4 * sizeof(int *)); for(i = 0; i < 4; i++) b[i] = malloc(3 * sizeof(int)); int row = 0; // variable to hold row number for next row to fill permute(a, 0, 2, b, &row, 4); // pass a pointer to the variable for(i = 0; i < 4; i++) { printf("\n"); for(j = 0; j < 3; j++) printf("%d ", b[i][j]); } printf("\n"); return 0; } 增加,并且它将立即在函数的所有调用中可见。

类似的东西:

0 1 2
0 2 1
1 0 2
1 2 0
2 1 0
2 0 1

0 1 2
0 2 1
1 0 2
1 2 0

输出:

CREATE OR REPLACE TRIGGER trg_voltype
  BEFORE INSERT ON volunteer
  FOR EACH ROW
BEGIN
  if :new.Volunteertype = 'STUDENT'
  then
     :new.Area_of_work := NULL;
     :new.StaffManagerName := NULL;
     :new.StaffManagerEmail := NULL;
     :new.StaffManagerPhone := NULL ;
   end if;  

END;