#include <string.h>
#define MAX 20
#define ENTRY_COUNT 14
#define INVALID -1000
typedef struct{
char A
char B
int Pro
}PROXIMITY_ENTRY
// entry sort from small to big
// '-', 'A', 'C', 'G', 'T'
PROXIMITY_ENTRY prox_tbl[ENTRY_COUNT] = {
{'-', 'A', -3},
{'-', 'C', -2},
{'-', 'G', -1},
{'-', 'T', -4},
{'A', 'A', 5},
{'A', 'C', -2},
{'A', 'G', -1},
{'A', 'T', -1},
{'C', 'C', 5},
{'C', 'G', -2},
{'C', 'T', -3},
{'G', 'G', 5},
{'G', 'T', -2},
{'T', 'T', 5}
}
// Insert a char to a string with index
void insert(char *str, int index)
{
char *p = str
int i = strlen(str)
while(i >= index)
{
*(p+i+1) = *(p+i)
i--
}
*(p+index) = '-'
}
// Proximity of two Gene ceil
int proximity(char a, char b)
{
int i
if(a >b)
{
return proximity(b, a)
}
for(i=0i<ENTRY_COUNTi++)
{
if((a == prox_tbl[i].A) &&(b == prox_tbl[i].B))
{
return prox_tbl[i].Pro
}
}
return INVALID
}
// Proximity of two Gene serial
int compare(char gene1[], char gene2[])
{
int i, n = strlen(gene1), sum = 0, temp
for(i=0i<ni++)
{
temp = proximity(gene1[i], gene2[i])
if (temp == INVALID)
{
sum = INVALID
break
}
else
{
sum += temp
}
}
return sum
}
// Insert '-' for max proximity of genes
int balance(char gene1[], char gene2[])
{
int i, sum, index = 0
static int max = INVALID
char str1[MAX]
int len1 = strlen(gene1)
int len2 = strlen(gene2)
if (len1 == len2)
{
return compare(gene1, gene2)
}
if (len1 >len2)
{
return balance(gene2, gene1)
}
for(i=0i<=len1i++)
{
strcpy(str1, gene1)
insert(str1, i)
sum = balance(str1, gene2)
if (sum >max)
{
max = sum
index = i
printf("%d: ", max)
printf("%s ", str1)
printf("%s\n", gene2)
}
}
return max
}
int main(void)
{
char gene1[MAX], gene2[MAX]
int pro
scanf("%s", gene1)
scanf("%s", gene2)
pro = balance(gene1, gene2)
if (pro == INVALID)
{
printf("Invalid input!\n")
}
else
{
printf("Max proximity: %d\n", pro)
}
return 0
}
输入
计算逆序值
稳定排序
代码:
#include <stdio.h>#include <string.h>
typedef struct
{
char arr[51]
int v
}ARR
int main()
{
ARR list[100]
ARR t
int n,l,i,j,k
scanf("%d%d", &l, &n)
for(i = 0 i < n i ++)
{
scanf("%s", list[i].arr)
list[i].v = 0
for(j = 0 j < l - 1 j ++)
{
for(k = j + 1 k < l k ++)
if(list[i].arr[k] < list[i].arr[j])
list[i].v ++
}
}
for (i = 0 i < n i++)
{
for (j = n - 1 j > i j--)
{
if (list[j].v < list[j-1].v)
{
memcpy(&t, &list[j-1], sizeof t)
memcpy(&list[j-1], &list[j], sizeof t)
memcpy(&list[j], &t, sizeof t)
}
}
}
for(i = 0 i < n i ++)
printf("%s\n", list[i].arr)
return 0
}
供参考
是否有问题? 有问题请追问 没问题请采纳