回复 9楼 九转星河
听懂了
[此贴子已经被作者于2017-4-30 08:49编辑过]
[此贴子已经被作者于2017-4-30 08:41编辑过]
[此贴子已经被作者于2017-4-30 09:00编辑过]
[此贴子已经被作者于2017-4-30 10:12编辑过]
5 5 1 2 3 4 5 5 5 3 2 1 4 5 1 3 4 2 5 5 4 2 1 3 5 5 2 1 3 4 5 3 6 5 7 3 2 1 4 3 3 8 5 4 7 5 3 2 0 总系列函数(0退出):1 5 3 4 2 1 3 4 5 总系列函数(0退出):5 3 7 8 5 3 2 1 4 总系列函数(0退出):
#include <stdio.h> int finddat(int *a,int l,int dat) {//在长度为l的数组a里找数dat;找到返回其位置,否则返回-1 int j=-1; for(;l&&a[l-1]!=dat;l--); if(l)j=l-1; return j; } void list(char a[][100],char *b,int row) {//显示调试步骤用,正常情况下不调用。 int i,j; for(i=0,printf("\n");i<row;i++,printf("\n")) for(j=0;a[i][j]>=0;j++) printf("%d ",a[i][j]);; printf("---"); for(i=0;b[i]>=0;i++)printf("%d ",b[i]); printf("\n"); } void shortser(char a[][100],char *b,int row) {//求最短系列,结果在数组b中返回 int i,j,k,p,c,t; for(i=0;i<row;i++) {//对第一列的处理 c=a[i][0]; for(j=0;j<row&&a[i][0]==a[j][0];j++); if(j>=row)break; for(j=0;b[j]>=0;j++); b[j]=c; b[j+1]=-1; for(j=0;j<row;j++) { if(a[j][0]==c) { for(k=0;a[j][k]>=0;k++)a[j][k]=a[j][k+1]; } } } while(1) {//差不多等效我在http://bbs.bccn.net/thread-472197-1-1.html里5楼的递归处理 for(i=0;i<row&&a[i][0]<0;i++); if(i>=row)break; for(i=p=0,c=100;i<row;i++) { for(j=t=0;j<row;j++) { for(k=1;a[j][k]>=0;k++)if(a[j][k]==a[i][0])t++; } if(t<c) { c=t; p=a[i][0]; } } for(i=0;i<row;i++) { if(a[i][0]==p||p<0) { if(p<0)p=a[i][0]; for(j=0;a[i][j]>=0;j++)a[i][j]=a[i][j+1]; } } for(i=0;b[i]>=0;i++); b[i]=p; b[i+1]=-1; } } void main() { int i,j,k,m,n,t,s,a[10000]; char b[100][100],c[10000]; //数组a用于存储输入的数,数组b用于存储每组数据的索引表,数组c为结果索引表 printf("总系列函数(0退出):"); while(scanf("%d",&n)&&n) { for(i=s=0;i<n;i++) {//接受输入,建立索引表 scanf("%d",&k); for(j=0;j<k;j++) { scanf("%d",&t); m=finddat(a,s,t); if(m<0) { b[i][j]=s; a[s]=t; s++; } else b[i][j]=m; b[i][j+1]=-1; } } c[0]=-1; shortser(b,c,n); for(i=0;c[i]>=0;i++)printf("%d ",a[c[i]]); //输出最短系列 printf("\n"); printf("总系列函数(0退出):"); } }