OpenJudge-计算机概论(A)-1-生日相同 2.0
描述:
在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日。试找出所有生日相同的学生。
输入
第一行为整数n,表示有n个学生,n≤180。此后每行包含一个字符串和两个整数,分别表示学生的名字(名字第一个字母大写,其余小写,不含空格,且长度小于20)和出生月(1≤m≤12)日(1≤d≤31)。名字、月、日之间用一个空格分隔。
输出
每组生日相同的学生,输出一行,其中前两个数字表示月和日,后面跟着所有在当天出生的学生的名字,数字、名字之间都用一个空格分隔。对所有的输出,要求按日期从前到后的顺序输出。对生日相同的名字,按名字从短到长顺序输出,长度相同的按字典顺序输出。如没有生日相同的学生,输出“None”。
样例输入
6
Avril 3 2
Candy 4 5
Tim 3 2
Sufia 4 5
Lagrange 4 5
Bill 3 2
样例输出
3 2 Tim Bill Avril
4 5 Candy Sufia Lagrange
分析:
对于这样的问题,首先想到的就是排序,的确也就是用排序做的,但是这个问题的排序是分为好几层来判断排序的,比较复杂的一个排序改写,最后输出时也要做一定的处理方能以我们需要的格式输出。
代码如下(C):
#include <stdio.h>
#include <string.h>
#define _MAX 181
int n;
char name[_MAX][21];
int len[_MAX];
int month[_MAX];
int day[_MAX];
//交换
void swap(int i, int j)
{
int k, length;
len[i] ^= len[j];
len[j] ^= len[i];
len[i] ^= len[j];
month[i] ^= month[j];
month[j] ^= month[i];
month[i] ^= month[j];
day[i] ^= day[j];
day[j] ^= day[i];
day[i] ^= day[j];
length = len[i] > len[j] ? len[i] : len[j];
for (k = 0; k < length; k++)
{
name[i][k] ^= name[j][k];
name[j][k] ^= name[i][k];
name[i][k] ^= name[j][k];
}
return ;
}
//判断字典顺序
int dic(int i, int j)
{
int k;
for (k = 0; k < len[i]; k++)
{
if (name[i][k] > name[j][k])
{
return 1;
}
else if (name[i][k] < name[j][k])
{
return 0;
}
}
return 0;
}
//排序
void sequence()
{
int i = 0, j = 0;
for (; i < n - 1; i++)
{
for (j = i + 1; j < n; j++)
{
if (month[i] > month[j])
{
swap(i, j);
}
else if (month[i] == month[j])
{
if (day[i] > day[j])
{
swap(i, j);
}
else if (day[i] == day[j])
{
if (len[i] > len[j])
{
swap(i, j);
}
else if (len[i] == len[j])
{
if (dic(i, j))
{
swap(i, j);
}
}
}
}
}
}
return ;
}
//输出
void print()
{
int i, j, count, key = 0;
for (i = 0; i < n;)
{
count = 0;
for (j = i + 1; j < n; j++)
{
if (month[i] == month[j] && day[i] == day[j])
{
count++;
}
else
{
break;
}
}
if (count)
{
key++;
printf("%d %d ", month[i], day[i]);
for (; i < j - 1; i++)
{
printf("%s ", name[i]);
}
printf("%s\n", name[i++]);
}
if (!key)
{
printf("None\n");
}
}
return ;
}
int main(int argc, const char * argv[])
{
int i = 0;
scanf("%d", &n);
for (; i < n; i++)
{
scanf("%s %d %d", name[i], &month[i], &day[i]);
len[i] = (int)strlen(name[i]);
}
sequence();
print();
return 0;
}
OVER!!!