感觉贪心算法就是分析移动两个数后到底是远离了排位还是靠近了排位~这题还是要想想看才行~
[此贴子已经被作者于2017-3-23 12:57编辑过]

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
程序代码:
#include <stdio.h>
#include <string.h>
#include <assert.h>
/**
*\brief 交换字符串中 字符的配置【可优化】
*
* 将 位置1 移动 位置2
*\param[in,out] 字符串
*\param[in] 位置1 字符串下标值
*\param[in] 位置2 字符串下标值
*\retval 交换的步数
*/
unsigned int exchange_chars(char *string, unsigned int pos1, unsigned int pos2)
{
char tmp;
unsigned int cnt = 0, i = 0;
if (pos1 > pos2){
for (i = pos1; i > pos2; --i){
++cnt;
tmp = string[i];
string[i] = string[i - 1];
string[i - 1] = tmp;
}
}else{
for (i = pos1; i < pos2; ++i){
++cnt;
tmp = string[i];
string[i] = string[i + 1];
string[i + 1] = tmp;
}
}
return cnt;
}
int main(void)
{
unsigned int i = 0, j = 0, cnt = 0;
unsigned int len = 0;
char string[8001];
//
scanf("%u", &len);
scanf("%s", string);
for (i = 0; i < len/2; ++i){
// 头部开始, 倒序搜索尾部
for (j = len - i - 1; j > i; --j){
if (string[i] == string[j]){
// 交换计算 步数
cnt += exchange_chars(string, j, len - i - 1);
break;
}
}
if (j > i){
continue;
}
// 尾部开始, 顺序搜索头部
for (j = i; j < len - i - 1; ++j){
if (string[len - i - 1] == string[j]){
// 交换计算 步数
cnt += exchange_chars(string, j, i);
break;
}
}
if (j >= len - i - 1){
printf("Impossible[%s]\n", string);
return 1;
}
}
printf("string:[%s] cnt:%u\n", string, cnt);
return 0;
}
[此贴子已经被作者于2017-3-23 20:53编辑过]