本文主要是介绍生产工序(oj题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
很有趣的一道题
关键在于固定工序的整合
看样例是固定工序中间是不能插入其他工序的(也不讲清楚),如果可以的话,只能说可能会更麻烦
注意固定工序是按照固定工序中的第一个工序进行排序的
整合完之后,就是递归列出所有的可能了
唯一新颖之处就是固定工序的整合
代码如下:
#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跳出多重循环
这篇关于生产工序(oj题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!