我有一个R行和C列的数组(R和C的最大值是50)。该程序要求用户输入行数,剧院列数,将观看电影的人数以及程序打印所有可能的座位组合。
例如2人,3行,3列
PP*
***
***
P*P
***
***
P**
P**
***
依旧......
我唯一能想到的是根据用户输入的人数使用可变数量的嵌套循环,但仍然不知道如何实现它。
有谁能解释我如何在C中实现/实现这个逻辑?
答案 0 :(得分:1)
似乎他并不需要区分不同的人,所以它选择了n个座位的R * C席位,其可能的案例数是C(R * C,n)
因此,对于R = 2,C = 2和n = 2,应该有6种组合: 00,11; 01,01; 10,01; 01,10; 10,10; 11,00;
编辑:嵌套循环解决方案:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
void OutSeats(int *seats,int R, int C, int n)
{
int i,j,k=0;
#ifdef DEBUG
for (i=1;i<=n;i++)
printf("%d,",seats[i]);
putchar('\n');
#else
/* It should be alloced only once */
static int* actual=0;
if (!actual)
actual = calloc(R*C,sizeof(int));
memset(actual,0,R*C*sizeof(int));
for (i=1;i<=n;i++)
actual[seats[i]-1] = 1;
for (i=0;i<R;i++)
{
for (j=0;j<C;j++,k++)
printf("%d",actual[k]);
putchar('\n');
}
putchar('\n');
#endif
}
/***********************************/
void GenCombination(int R, int C, int n)
{
int *seats = (int*)malloc((n+1)*sizeof(int));
int i,sub;
for (i=1;i<=n;i++)
seats[i]=i;
while (1)
{
OutSeats(seats,R,C,n);
if (seats[n]<R*C)
seats[n]++;
else
{
sub=1;
while ((sub<n) && (seats[n-sub]>=R*C-sub))
sub++;
if (sub<n)
{
seats[n-sub]++;
for (i=n-sub+1 ; i<=n ; i++)
seats[i] = seats[i-1] + 1;
}
else
break;
}
}
free(seats);
}
/***********************************/
void main()
{
int R,C,n;
printf("Give R,C,n:");
scanf("%d%d%d",&R,&C,&n);
GenCombination(R,C,n);
}
阵列座位可容纳分配给每个人的座位。 GenCombination就像一个时钟。它会增加最后一个项目,直到达到最大边界然后向后移动并尝试增加之前的项目并再次到达最后一个项目。指定座位的顺序始终在增加,以便生成唯一的组合。 功能OutSeats通过将指定座位转换为实际座位来打印座位安排。
答案 1 :(得分:0)
也许你可以输出这样的东西:
每行1个座位,1行,1个人。
1
1组合。
现在每排一排两个座位和一个人:
10 01
2种组合。
现在,每行有两排座位和两个人:
12 21
2种组合。
2排两个座位和1个人:
10 01 00 00
00 00 10 01
4种组合
两排两个座位和两个人:
21 20 20 12 02 02 10 01 00 10 01 00
00 10 01 00 10 01 20 20 21 02 02 12
24种组合。
3排2个席位和一个人:
100 010 001 000 000 000 000 000 000
000 000 000 100 010 001 000 000 000
000 000 000 000 000 000 100 010 001
总共9个组合;
(飞机降落......现在要去......)