很有趣的一道題
關鍵在于固定工序的整合
看樣例是固定工序中間是不能插入其他工序的(也不講清楚),如果可以的話,只能說可能會更麻煩
注意固定工序是按照固定工序中的第一個工序進行排序的
整合完之后,就是遞歸列出所有的可能了
唯一新穎之處就是固定工序的整合
代碼如下:
#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跳出多重循環