题意:就是有k位数,然后进行全排列,将给出的n个数都按照这种全排列的位次进行交换,然后找出最大值与最小值,输出所有全排列情况下差值最小的那个。
题解:使用dfs找出所有全排列的方式,然后进行判断。
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int n,k;
char s[100][100];
int used[100],a[100];
int cnt,minn,maxx;
const int inf=99999999;
void dfs(int pos)
{
minn=inf,maxx=-inf;
if(pos==k+1)
{
for(int i=1;i<=n;i++)
{
int ans=0;
for(int j=1;j<=k;j++)
{
ans=ans*10+s[i][a[j]]-'0';
}
maxx=max(maxx,ans);
minn=min(minn,ans);
}
cnt=min(maxx-minn,cnt);
}
else
{
for(int i=1;i<=k;i++)
{
if(used[i]==0)
{
used[i]=1;
a[pos]=i;
dfs(pos+1);
used[i]=0;
}
}
}
}
int main( )
{
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>s[i];
dfs(1);
cout<<cnt<<endl;
return 0;
}