POJ 3359 Wordfish

問題

文字列が与えられる。
文字列の順列のうち、与えられた文字列の次の10個および前の10個に対して、
隣り合う文字間の距離の最小値が最大のもの、およびその値を求めよ。


ただし文字aと文字b間の距離とはabs((int)a-(int)b)を意味する。

方針

問題文が凄くあいまいだが、
文字間の距離は単に文字を数字とみて引き算して、絶対値を取ればいいらしい。
しかも、zの次がaだったりもしない。意味不明。


next_permutationおよびprev_permutationで前後の10順列を取り、
それぞれについて隣り合う文字の距離を計算してやればよい。


ナイーブに実装しておk

ソースコード

int n,md;
string in;

int main()
{
	while(cin>>in){
		n=in.size();
		string tmp=in, ans;
		
		md=-1;
		rep(it,10){
			next_permutation(all(tmp));
			int mn=inf;
			rep(i,n-1)mn=min(mn,abs(tmp[i]-tmp[i+1]));
			if(md<mn||md==mn&&ans>tmp)ans=tmp, md=mn;
		}
		tmp=in;
		rep(it,10){
			prev_permutation(all(tmp));
			int mn=inf;
			rep(i,n-1)mn=min(mn,abs(tmp[i]-tmp[i+1]));
			if(md<mn||md==mn&&ans>tmp)ans=tmp, md=mn;
		}
		cout<<ans<<md<<endl;
	}
	return 0;
}