【轉】信息奧賽一本通1185:單詞排序(OJ題目描述有問題)

轉自:https://blog.csdn.net/mengdicfm/article/details/88384963

1185:單詞排序

時間限制: 1000 ms 內存限制: 65536 KB
提交數: 3474 通過數: 1685
【題目描述】
輸入一行單詞序列,相鄰單詞之間由1個或多個空格間隔,請按照字典序輸出這些單詞,要求重複的單詞只輸出一次。(區分大小寫)

【輸入】
一行單詞序列,最少1個單詞,最多100個單詞,每個單詞長度不超過50,單詞之間用至少1個空格間隔。數據不含除字母、空格外的其他字符。

【輸出】
按字典序輸出這些單詞,重複的單詞只輸出一次。

【輸入樣例】
She wants to go to Peking University to study Chinese
【輸出樣例】
Chinese
Peking
She
University
go
study
to
wants

這題表述有問題,題目說是一行單詞序列,但是我編程序接收一行單詞序列時,樣例都能過,自己輸入英文句子,也能過。提交時所有點都是“答案錯誤”(看我的程序一代碼)。後來,問了別人,別人告訴我,是要接收多行單詞,把程序改了一下,反覆接收一行單詞,並記錄,就過了。(看我的程序二代碼)
區別就是把getline(cin,danci)放在while循環中,反覆接收單詞序列,直到文件結束,停止接收(因爲測試OJ是通過文件進行輸入輸出的)。

希望後面的人不要跟我一樣被題目描述坑了哦。

程序一(所有點提示答案錯誤):

//1185:單詞排序
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char a[101][51];
int len,i,k=0,j;
string danci;

void paixu(char a[101][51],int start,int end) //自定義排序函數,對字二維符串數組排序
{
    char tmp[51];
    int i,j;
    for(i=end-1;i>=1;i--)
    {
        for(j=start;j<=i;j++)
        {
            if(strcmp(a[j],a[j+1])>0) //如果字典序逆序,則交換 
            {
                strcpy(tmp,a[j]); //將a[j]字符串複製到臨時字符串tmp中 
                strcpy(a[j],a[j+1]);
                strcpy(a[j+1],tmp);
            }
        }
        
    }
    return;
 } 
int main()
{
    bool flag=false;//是否遇到一個新單詞,false表示沒有遇到,true表示遇到了 
    memset(a,0,sizeof(a));
    getline(cin,danci);//接收單詞序列,碰到換行結束,可以接收空格 
    danci=" "+danci+" ";//在單詞序列前後加空格
    len=danci.length();

    j=0;
    for(i=0;i<len;i++)
    {
        
        if(danci[i]==' ') //碰到空格,表明不是一個單詞 
        {
            flag=false;
            //a[k][j]='\0';
            
        }
        else //碰到的不是空格時 
        {
            if(flag==false)
            {
                k++;//新單詞 
                j=0;
                flag=true;
                a[k][j]=danci[i];
                j++;
            }
            else //單詞中間字母 
            {
                a[k][j]=danci[i];
                j++;
            }    
        } 
        
    }
    paixu(a,1,k);//對記錄1至k的單詞按字典序升序排序 
    for(i=1;i<=k;i++)
    {
        if(strcmp(a[i],a[i-1])==0)//如果和前面字符串相等,則不輸出,相同字符串輸出一次
        continue; 
        cout<<a[i]<<endl;
    }
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
程序二(所有點通過):

//1185:單詞排序
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char a[101][51];
int len,i,k=0,j;
string danci;

void paixu(char a[101][51],int start,int end) //自定義排序函數,對字二維符串數組排序
{
    char tmp[51];
    int i,j;
    for(i=end-1;i>=1;i--)
    {
        for(j=start;j<=i;j++)
        {
            if(strcmp(a[j],a[j+1])>0) //如果字典序逆序,則交換 
            {
                strcpy(tmp,a[j]); //將a[j]字符串複製到臨時字符串tmp中 
                strcpy(a[j],a[j+1]);
                strcpy(a[j+1],tmp);
            }
        }
        
    }
    return;
 } 
int main()
{
    bool flag=false;//是否遇到一個新單詞,false表示沒有遇到,true表示遇到了 
    memset(a,0,sizeof(a));
    while(getline(cin,danci))//反覆接收單詞序列(接收多行單詞序列),碰到換行結束,可以接收空格 
    {
    danci=" "+danci+" ";//在單詞序列前後加空格
    len=danci.length();
    j=0;
    for(i=0;i<len;i++)
    {
        
        if(danci[i]==' ') //碰到空格,表明不是一個單詞 
        {
            flag=false;
            //a[k][j]='\0';
            
        }
        else //碰到的不是空格時 
        {
            if(flag==false)
            {
                k++;//新單詞 
                j=0;
                flag=true;
                a[k][j]=danci[i];
                j++;
            }
            else //單詞中間字母 
            {
                a[k][j]=danci[i];
                j++;
            }    
        } 
        
    }    
    }
    
    
    paixu(a,1,k);//對記錄1至k的單詞按字典序升序排序 
    for(i=1;i<=k;i++)
    {
        if(strcmp(a[i],a[i-1])==0)//如果和前面字符串相等,則不輸出,相同字符串輸出一次
        continue; 
        cout<<a[i]<<endl;
    }
    return 0;
}
--------------------- 
作者:mengdicfm 
來源:CSDN 
原文:https://blog.csdn.net/mengdicfm/article/details/88384963 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章