AT_abc302_c题解
简单题。
数据范围极小,直接暴搜顺序,判断是否差一个字母即可。
记得枚举开始的字符串。
#include<bits/stdc++.h>
using namespace std;
const int N=10;
string s[N];
int a[N][200],m,n;
bool b[N];
void dfs(int now,int x)//now是当前到哪个字符串,x是搜了几个
{
if(x==n)
{
cout<<"Yes";
exit(0);
}
for(int i=1;i<=n;i++)
{
if(!b[i])
{
int sum=0;
for(int j=0;j<=100;j++)
{
sum+=abs(a[now][j]-a[i][j]);
}
if(sum==2)//记得是差2
{
b[i]=1;
dfs(i,x+1);
b[i]=0;
}
}
}
return;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>s[i];
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<m;j++)
{
a[i][s[i][j]-'a']++;//记录每种字母各有多少
}
}
for(int i=1;i<=n;i++)
{
b[i]=1;
dfs(i,1);
b[i]=0;
}
cout<<"No";
return 0;
}