我们已经知道了将N个整数按从小到大排序的冒泡排序法。本题要求将此方法用于字符串序列,并对任意给定的K( <nobr> K<N </nobr>),输出扫描完第K遍后的中间结果序列。

输入格式:
输入在第1行中给出N和K( <nobr> 1K<N100 </nobr>),此后N行,每行包含一个长度不超过10的、仅由小写英文字母组成的非空字符串。

输出格式:
输出冒泡排序法扫描完第KK遍后的中间结果序列,每行包含一个字符串。

输入样例:

6 2
best
cat
east
a
free
day

输出样例:

best
a
cat
day
east
free

*注

感觉这里的样例有一点问题。

best cat east a free day

这6个字符串扫描一遍之后应该为;

cat best a east day free

扫描两遍之后应该为:

cat a best day east free

但是给的输出样例却是:

best a cat day east free

这个应该是把第一个字符串排除然后扫描得到的结果。

程序代码:

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
int main()
{
    int N,k;
    cin>>N>>k;
    char temp[20];
    int i=0;
    char str[N][11];
    while(i<N)
    {
        //scanf("%s",str[i]);
        cin>>str[i];
        i++;
    }   
    i=0;    
    for(int i=N-1;i>N-1-k;i--)
    {
        //这里的j值本来应该从0开始,但是为了得到跟输出样例一直的结果,改为从1开始扫描。
        for(int j=1;j<i;j++)
            if(strlen(str[j])>strlen(str[j+1]))
            {
                strcpy(temp,str[j]);
                strcpy(str[j],str[j+1]);
                strcpy(str[j+1],temp);
            }           
    }
    int a=0;
    while(a<N)
    {
        if(a==(N-1))
            cout<<str[a];
        else
            cout<<str[a]<<endl;
        a++;
    }

    return 0;
}

运行结果:

这段代码通过了两个测试用例,第三个没有通过,不知道是什么原因。