小女子不才,未得代码青睐~

今天来看这道题:

题目描述

给定 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​ 互不相同。

样例一解释

安排顺序如下:abcdabedbbedfbed。满足条件。

样例二解释

无论如何对这两个字符串排序,均不可能满足条件。

输入输出样例

输入 #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;
}

Logo

集算法之大成!助力oier实现梦想!

更多推荐