2011年8月18日 星期四

d634: 魔法卡magic

內容 :
    繼梅蘭城的法師們在你的幫助下,成功節約符咒之後,
    他們順利大量生產了各式魔法的符咒,但是…
    符咒太多了所以把符咒室弄得亂七八糟的-▽-
    所以請你寫一個程式再度幫助他們把符咒整理好吧。

輸入說明 :
    每個測資點僅一組測資,不必EOF讀檔。
    第一行有整數n(1<n<=100000)表示接下來有n張符咒
    從第二行開始的n行
    每行有一個符咒的名稱,內容可能包含小寫字母、大寫字母、數字、空格字元。
    並且每行不超過10個字元

輸出說明 :
    請依照"檔案系統"的方法,將這n個符咒排序後的結果輸出。
    所謂檔案系統排序就是,
    對於兩個英文單字的比較以abc和xyz來說,
    先從第一個字母的"ASCII"值開始比,
    (以這題出現的ASCII來說,空格<數字<大寫字母(A~Z)<小寫字母(a~z))
    如a<x,所以abc在xyz前面。
    如果第一個字母相同,則比較下一個字母,如abx對上aby,
    比到第三位x<y,所以abx在aby前面。

範例輸入 :
7
penguin
jacker
jack doom
JACK
ws23
aszx87140
e196819

範例輸出 :
JACK
aszx87140
e196819
jack
doom
jacker
penguin
ws23

提示 :
背景知識: 排序
1.字串排序
2.共三個測資點30%、35%、35%,
第一個測資點即範例測資。

程式碼 :
#include<stdio.h>
#include<string.h>

char s[100000][11],temps[11];

void qsort(int left, int right)
{
    int i = left, j = right+1, temp;
    int ii = left-1, jj = j;
    if(left < right)
    {
        while(1)
        {
            while((i+1)<jj && strcmp(s[++i],s[left])<0);
            while((j-1)>ii && strcmp(s[--j],s[left])>0);
            if(i >= j)
                break;
            
            strcpy(temps,s[i]);
            strcpy(s[i],s[j]);
            strcpy(s[j],temps);
        }
        
        strcpy(temps,s[left]);
        strcpy(s[left],s[j]);
        strcpy(s[j],temps);
        
        qsort(left, j-1);
        qsort(j+1, right);
    }
}

int main()
{
    int i,j,n,temp,arr[100000];
        
    while(scanf("%d",&n)==1)
    {
        getchar();
        for(i=0; i<n; i++)
            gets(s[i]);
        
        qsort(0,n-1);
        
        for(i=0; i<n; i++)
            printf("%s\n",s[i]);
    }
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d634

沒有留言:

張貼留言