很有趣的一道题
关键在于固定工序的整合
看样例是固定工序中间是不能插入其他工序的(也不讲清楚),如果可以的话,只能说可能会更麻烦
注意固定工序是按照固定工序中的第一个工序进行排序的
整合完之后,就是递归列出所有的可能了
唯一新颖之处就是固定工序的整合
代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Process{int num[100];int len;
}process[10];
void dg(int n);
int count, pn, occ[10];
int result[11];int main(void)
{int N, M;scanf("%d%d", &N, &M);{struct Process tmp[10];memset(tmp, 0, sizeof(tmp));for(int i = 0; i < M; i++){scanf("%d", &tmp[i].len);for(int j = 0; j < tmp[i].len; j++)scanf("%d", &tmp[i].num[j]);}//创建整合后的工序for(int x = 1; x <= N; x++){for(int i = 0; i < M; i++)for(int j = 0; j < tmp[i].len; j++)if(x == tmp[i].num[j]){if(j == 0) memcpy(&process[pn++], &tmp[i], sizeof(tmp[i]));goto out;}process[pn].len = 1;process[pn++].num[0] = x;out: ;}}dg(1);return 0;
}
void dg(int n)
{for(int i = 0; i < pn; i++)if(!occ[i]){occ[i] = 1;result[n] = i;if(n != pn)dg(n + 1);else{printf("%d.", ++count);for(int j = 1; j <= pn; j++){for(int x = 0; x < process[result[j]].len; x++)printf(" %d", process[result[j]].num[x]);}putchar('\n');}occ[i] = 0;}
}
因为tmp的适用范围只有在整合部分,所以整了个动态变量
这里用了goto跳出多重循环