算次數。
'A'可以無視。
/* ACM 612
* mythnc
* 2011/10/24 19:32:54
* run time: 0.092
*/
#include <stdio.h>
#define LEN 50
#define MAX 100
int dna(char *pt);
int sum_unsorted(char *pt);
void sort_dna(char (*pt)[LEN + 1], int *record, int n);
int main(void)
{
int set, len, n, i, line;
char ary[MAX][LEN + 1];
int record[MAX];
line = 0;
scanf("%d", &set);
while (set--) {
if (line == 1)
printf("\n");
scanf("%d %d", &len ,&n);
for (i = 0; i < n; i++)
scanf("%s", ary[i]);
for (i = 0; i < n; i++)
record[i] = dna(ary[i]);
sort_dna(ary, record, n);
line = 1;
}
return 0;
}
/* dna: find the sorted degree of each dna
* return degrees */
int dna(char *pt)
{
int sum;
sum = 0;
while (*pt)
switch (*pt) {
case 'C':
case 'G':
case 'T':
sum += sum_unsorted(pt);
case 'A':
pt++;
}
return sum;
}
/* sum: sum the unsorted number of each dna
* and return it */
int sum_unsorted(char *pt)
{
int sum;
char *pt_m;
sum = 0;
pt_m = pt;
while (*++pt_m)
if (*pt_m < *pt)
sum++;
return sum;
}
/* sort_dna: find the tiniest record to largest
* then print the mapping pt sequentially */
void sort_dna(char (*pt)[LEN + 1], int *record, int n)
{
int min, i;
while (1) {
for (min = i = 0; i < n; i++)
if (record[i] < record[min])
min = i;
if (record[min] == 2000)
break;
printf("%s\n", pt[min]);
record[min] = 2000;
}
}
沒有留言:
張貼留言