洛谷AT_abc302_c [ABC302C] Almost Equal
给定 N 个长度为 M 的仅包含小写英文字母的字符串 S1,S2,⋯,SN。保证 Si 互不相同。どのように並び替えても条件を満たすことは出来ません。无论如何对这两个字符串排序,均不可能满足条件。の順に並び替えると条件を満たします。
·
小女子不才,未得代码青睐~
今天来看这道题:
题目描述
给定 N 个长度为 M 的仅包含小写英文字母的字符串 S1,S2,⋯,SN。保证 Si 互不相同。
判断是否可以通过对这些字符串重新排序,得到一个新的字符串序列 T1,T2,⋯,TN,使得:
- 对于任意 i 使得 1≤i≤N−1,均满足 Ti 在改变恰好一个字母后可以等于 Ti+1。
数据范围
- 2≤N≤8
- 1≤M≤5
- 保证 Si 长度为 M,且仅由小写英文字母组成。(1≤i≤N)
- 保证 Si 互不相同。
样例一解释
安排顺序如下:abcd
,abed
,bbed
,fbed
。满足条件。
样例二解释
无论如何对这两个字符串排序,均不可能满足条件。
输入输出样例
输入 #1
4 4 bbed abcd abed fbed
输出 #1
Yes
输入 #2
2 5 abcde abced
输出 #2
No
输入 #3
8 4 fast face cast race fact rice nice case
输出 #3
Yes
说明/提示
制約
- 2 ≤ N ≤ 8
- 1 ≤ M ≤ 5
- Si は英小文字からなる長さ M の文字列である。(1 ≤ i ≤ N)
- Si は互いに異なる。
Sample Explanation 1
abcd
, abed
, bbed
, fbed
の順に並び替えると条件を満たします。
Sample Explanation 2
どのように並び替えても条件を満たすことは出来ません。
最后的日语看不懂,凭感觉写的
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn=10;
int n,m;
string s[maxn],t[maxn];
bool v[maxn];
void dfs(int k) {
if(k>n) {
for(int i=1; i<n; i++) {
int cnt=0;
for(int j=0; j<m; j++) {
if(t[i][j]!=t[i+1][j]) cnt++;
if(cnt>1) break;
}
if(cnt==0||cnt>=2) return;
}
cout<<"Yes";
exit(0);
}
for(int i=1; i<=n; i++) {
if(v[i]) continue;
t[k]=s[i];
v[i]=1;
dfs(k+1);
v[i]=0;
}
}
int main() {
cin>>n>>m;
for(int i=1; i<=n; i++) cin>>s[i];
dfs(1);
cout<<"No";
return 0;
}
更多推荐
所有评论(0)