Codeforces Beta Round #92 (Div. 2 Only) B. Permutations

You are given n k-digit integers. You have to rearrange the digits in the integers so that the difference between the largest and the smallest number was minimum. Digits should be rearranged by the same rule in all integers.

Input

The first line contains integers n and k — the number and digit capacity of numbers correspondingly (1 ≤ n, k ≤ 8). Next n lines containk-digit positive integers. Leading zeroes are allowed both in the initial integers and the integers resulting from the rearranging of digits.

Output

Print a single number: the minimally possible difference between the largest and the smallest number after the digits are rearranged in all integers by the same rule.

Sample test(s)
input
6 4
5237
2753
7523
5723
5327
2537
output
2700
input
3 3
010
909
012
output
3
input
7 5
50808
36603
37198
44911
29994
42543
50156
output
20522
Note

In the first sample, if we rearrange the digits in numbers as (3,1,4,2), then the 2-nd and the 4-th numbers will equal 5237 and 2537 correspondingly (they will be maximum and minimum for such order of digits).

In the second sample, if we swap the second digits and the first ones, we get integers 100, 99 and 102.

题意:给你n个字符串,每个字符串的长度都为k,然后对每个字符串中的字母顺序进行调换,当一个字符串调换顺序时,其他字符串都以相同的规律调换,问你调换过程中最大的数和最小的数的差的最小值是多少。

思路:只要把所有情况搜出来就行了,刚开始还想找规律。。

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
char s[100][100],str[100];
int vis[100],k,cha,b[100],n;
#define inf 99999999
void dfs(int wei)
{
	int i,j,minx=inf,maxx=-inf,num;
	if(wei==k+1){
		num=0;
		for(i=1;i<=n;i++){
			num=0;
			for(j=1;j<=k;j++){
				num=num*10+s[i][b[j]]-'0';
			}
			maxx=max(maxx,num);
			minx=min(minx,num);
		}
		cha=min(cha,maxx-minx);//return;
	}
	else{
		 for(i=1;i<=k;i++){
		   if(!vis[i]){
			  vis[i]=1;
			  b[wei]=i;
			  dfs(wei+1);
			  vis[i]=0;
		   }
	    }
	}
}


int main()
{
	int m,i,j,t,num;
	char c;
	while(scanf("%d%d",&n,&k)!=EOF)
	{
		for(i=1;i<=n;i++){
			scanf("%s",s[i]+1);
		}
		cha=inf;
		if(n==1){
			printf("0\n");continue;
		}
		memset(vis,0,sizeof(vis));
		dfs(1);
		printf("%d\n",cha);
	}
	return 0;
}


posted @ 2015-08-13 09:06  Herumw  阅读(123)  评论(0编辑  收藏  举报