您的位置:首页 > 其它

PKU ACM 1007题“DNA Sorting”的一种解法

2009-11-03 17:48 260 查看
PKU ACM 1007题“DNA Sorting”的一种解法

1. 题目
  http://acm.pku.edu.cn/JudgeOnline/problem?id=1007

2. 需求解析
a) 输入的第1行有2个正整数,即字符串长度n和字符串个数m。
b) n的值域是0 < n <= 50。
c) m的值域是0 < n <= 100。
d) 随后输入m行字符串,每行长度为n。
e) 字符串的逆序数定义为:在一个字符串中,如果一对字符的前后位置与大小顺序相反,即前面的字符大于后面的字符,那末它们就称为一个逆序。一个字符串中逆序的总数就称为这个字符串的逆序数。
f) 按字符串的逆序数的递增对字符串排序。
g) 当两个字符串的逆序数相同,则保持它们的原来顺序。
h) 输出排序后的字符串。

3. 数据结构设计
#define MAX_M 100
#define MAX_N (50+1)
typedef struct
{
int reverse_rank; /*逆序数*/
int initial_order; /*字符串的初始顺序号*/
} dna_attr;

dna_attr dna_attr_buffer[MAX_M];
char dna_str[MAX_M][ MAX_N];
int n; /*字符串长度*/
int m; /*字符串个数*/

4. 算法设计

4.1. main函数

void main()
{
int i, j, k;
scanf("%d %d/n",&n,&m); /*读入n和m*/
for (i=0; i<m; i++)
{
gets(dna_str[i]); /*按行读入dna_str*/

dna_attr_buffer[i].initial_order = i;
/*计算逆序数*/
dna_attr_buffer[i].reverse_rank = 0;
for(j=0; j<n-1; j++)
{
for(k=j+1; k<n; k++)
if(dna_str[i][j]>dna_str[i][k]) dna_attr_buffer[i].reverse_rank++;
}
}
qsort(dna_attr_buffer, m, sizeof(dna_attr), compare); /*排序*/
for (i=0; i<m; i++) /*输出*/
{
printf("%s/n", dna_str[dna_attr_buffer[i].initial_order]);
}
return 0;
}

4.2. compare函数

int compare (const void *data1, const void *data2)
{
int t = ((dna_attr *)data1)->reverse_rank - ((dna_attr *)data2)->reverse_rank;
if (t == 0) t = ((dna_attr *)data1)->initial_order - ((dna_attr *)data2)->initial_order;
return t;
}
5. 结论
 本题不需要对字符串排序,也不必自己写排序函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: