我想编写一个函数来生成数字的所有排列并将它们存储到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 |
答案 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;