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;
}