ACM HDU1263:水果
我的代码输出格式没有问题,其他人和我同格式已经通过了,已经用多组数据测试过,均可显示正确答案,但在上传时就是不能通过,希望大家帮忙看看,谢谢了。描述:夏天来了~~好开心啊,呵呵,好多好多水果~~
Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.现在他想要一份水果销售情况的明细表,这样Joe就可以很容易掌握所有水果的销售情况了.
输入:第一行正整数N(0<N<=10)表示有N组测试数据.
每组测试数据的第一行是一个整数M(0<M<=100),表示工有M次成功的交易.其后有M行数据,每行表示一次交易,由水果名称(小写字母组成,长度不超过80),水果产地(小写字母组成,长度不超过80)和交易的水果数目(正整数,不超过100)组成.
输出:对于每一组测试数据,请你输出一份排版格式正确(请分析样本输出)的水果销售情况明细表.这份明细表包括所有水果的产地,名称和销售数目的信息.水果先按产地分类,产地按字母顺序排列;同一产地的水果按照名称排序,名称按字母顺序排序.
两组测试数据之间有一个空行.最后一组测试数据之后没有空行.
例子输入:
1
5
apple shandong 3
pineapple guangdong 1
sugarcane guangdong 1
pineapple guangdong 3
pineapple guangdong 1
例子输出:
guangdong
|----pineapple(5)
|----sugarcane(1)
shandong
|----apple(3)
代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct fr{
char style[80];
char place[80];
int num;
}e[100],ce;
char pc[100][80],pp[80],flag;
int main()
{
int i,j,k,n,a,b,l,t;
scanf("%d",&n);
for (l=1;l<=n;l++)
{
for (j=0;j<100;j++)//数组初始化
{
for (k=0;k<80;k++)
{
e[j].style[k]='\0';
e[j].place[k]='\0';
}
e[j].num=0;
}
for (j=0;j<100;j++)//数组初始化
for (k=0;k<80;k++)
pc[j][j]='\0';
scanf("%d",&a);
for (j=0;j<a;j++)
scanf("%s %s %d",e[j].style,e[j].place,&e[j].num);
b=a;
for (j=0;j<b;j++)//压缩,将种类和地址相同的项目数目相加
{
for (k=j+1;k<b;k++)
{
if (!strcmp(e[j].style,e[k].style)&&!strcmp(e[j].place,e[k].place))
{
e[j].num+=e[k].num;
e[k].num=0;
}
}
}
b=0;
t=0;
for (j=0;j<a;j++)//将地址采集进pc组
{
flag=0 ;
if (e[j].num)
{
t++;//t为统计的不同项数
for (k=0;k<b+1;k++)//此处b为不同地址数
if (!strcmp(e[j].place,pc[k])){flag=1;break;}
if (!flag) strcpy(pc[b++],e[j].place);
}
}//完毕
for (i=0;i<a;i++)//对地址组pc排序
for (j=i+1;j<b;j++)
if(strcmp(pc[i],pc[j])>0){strcpy(pp,pc[i]);strcpy(pc[i],pc[j]);strcpy(pc[j],pp);}
for (i=0;i<a;i++)//对相同地址进行水果种类的排序
for (j=i+1;j<a;j++)
{
if (e[j].num!=0&&!strcmp(e[i].place,e[j].place))
if(strcmp(e[i].style,e[j].style)>0){ce=e[i];e[i]=e[j];e[j]=ce;}
}
for (i=0;i<b;i++)//按地址顺序输出
{
printf ("%s\n",pc[i]);
for (j=0;j<80;j++)
if (e[j].num&&!strcmp(pc[i],e[j].place))
printf(" |----%s(%d)\n",e[j].style,e[j].num);
}
if (n-l>0)printf("\n");
}
return 0;
}