劳动节的劳动!不知道正确与否,还望各大神测试。
上午和闺蜜就在附近海滩逛了逛,玩的也不尽兴,脑子一直在考虑这个题目解决方法。突然想到把行变成列,那么这一列的数据顺序可随便调换的,只要每列的顺序正确即可,迫不及待回宿舍码代码,弄得头昏眼花的,简单测试了题主和九版主的数据,结果一致,现提交如下:
程序代码:
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退出):");
}
}