Excellence(2015 Pacific Northwest Region Programming Contest—Division 2)(字符串排序问题)



题目链接:http://codeforces.com/gym/100819     

题目如上图所示,翻译过来就是:先输入一个整数n,代表这个班上学生的数量,然后下面紧接着有n行,

每行由       名字+一个空格+姓  (last name(中间一个空格)first name)。  (n不大于100,名与姓字符串长度不大于10)

输出要求: 对名字进行排序,先对姓排序,按小到大排序,  例如  Anna <Bob <Codeforces,然后在对姓相同但名不同的,对名进行从小到大的排序,规律与上文相同。 




这道题,应该算一道水题,但是却花了我挺长的时间,因为我对  strcmp函数不是很熟悉 ,所以我花了很长的时间去debug,但是我觉得挺划算的,经过这道题,我克服自己对字符串问题的恐惧心理,并不是因为他难,而是复杂,一不小心就在写bug。


这题运用到       strcpy(str1,str2)   字符串的抄写函数,(将str2赋给str1) 

                       strcmp(str1,str2) 字符串的比较函数,

                                                        当str1与str2相等时    返回值为0

                                                        当str1大于str2时     返回值为正数

                                                         当str1小于str2时   返回值为负数


            还有一点是运用了选择排序, 每经过一个循环,找出最小的字符串,然后和    未决定位置且最前面的字符串    交换位置,即每次循环决定一个位置,和冒泡相似,冒泡是决定最后一个位置,选择排序是决定第一个位置。

运用上面的足以解决这道题。

附代码:


#include<stdio.h>
#include<string.h>
char name[110][20],str[110][20],min[20];     //  name代表名     str 代表姓氏 
int main()
{
int n;
while (scanf("%d",&n)!=EOF)
{
memset(name,'\0',sizeof(name));     
memset(str,'\0',sizeof(str));
int i,j,t,temp;
for(i=0;i<n;i++)
{
scanf("%s %s",name[i],str[i]);
}
for (i=0;i<n;i++)
{
strcpy(min,str[i]);
t=-1;
for (j=i+1;j<n;j++)
{
if (strcmp(str[j],min)<0)
{
strcpy(min,str[j]);
t=j;  
}
}
if (t==-1) 
continue;
strcpy(min,str[i]); //选择排序
strcpy(str[i],str[t]);
strcpy(str[t],min);
strcpy(min,name[i]);
strcpy(name[i],name[t]);
strcpy(name[t],min);
}
for (temp=1;temp;)
{
temp=0;
for (i=0;i<n-1;i++)
{
if (strcmp(str[i],str[i+1])==0)
{
if (strcmp(name[i],name[i+1])>0)
{ temp++;
strcpy(min,str[i]);
strcpy(str[i],str[i+1]);
strcpy(str[i+1],min);
strcpy(min,name[i]);
strcpy(name[i],name[i+1]);
strcpy(name[i+1],min);
}
}
}
}
for (i=0;i<n;i++)
{
printf ("%s %s\n",name[i],str[i]);
}
}
return 0;

猜你喜欢

转载自blog.csdn.net/a1204675546/article/details/79718650