思路还是不成熟,这个题WA了好多次‘,判断能否变成回文对了,但是交换时只是从左起第i位(i=0,1,2,……),找到与之相同的,移到与第i位对称的位置,同时记录步数,但是这并不是最小的交换次数,看到http://blog.csdn.net/shuangde800/article/details/7828655,应该是使每次交换所需的移动步数最小。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
int main()
{
//freopen("in.txt","r",stdin);
int cas,num[30],step,vis[110];
char str[110];
scanf("%d",&cas);
getchar();
while(cas--)
{
gets(str);
memset(num,0,sizeof(num));
for(int i=0; str[i]!='\0'; i++)
num[str[i]-'a']++;
int flag=0;
for(int i=0; i<26; i++)
if(num[i]%2)
flag++;
if(flag>1||(flag&&strlen(str)%2==0))
{
cout<<"Impossible\n";
continue;
}
step=0;
int right=strlen(str)-1,left=0;
while(left<right)
{
memset(vis,0,sizeof(vis));
int lleft=left,rright=right,max=100000;
for(int i=left; i<right; i++)
{
if(vis[i]) continue;
vis[i]=1;
int last=i;
for(int j=i+1; j<=right; j++)
{
if(str[j]==str[i])
{ flag=1;
last=j;vis[j]=1;
}
}
if(right-last+i-left<max)
{
max=right-last+i-left;
lleft=i;
rright=last;
}
}
for(int i=lleft; i>left; i--)
{
char temp;
temp=str[i];
str[i]=str[i-1];
str[i-1]=temp;
step++;
}
for(int i=rright; i<right; i++)
{
char temp;
temp=str[i];
str[i]=str[i+1];
str[i+1]=temp;
step++;
}
left++;
right--;
}
cout<<step<<endl;
}
return 0;
}