繼梅蘭城的法師們在你的幫助下,成功節約符咒之後,
他們順利大量生產了各式魔法的符咒,但是…
符咒太多了所以把符咒室弄得亂七八糟的-▽-
所以請你寫一個程式再度幫助他們把符咒整理好吧。
輸入說明 :
每個測資點僅一組測資,不必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
沒有留言:
張貼留言