题目详情:给定一组字符串,判断这些字符串能否首尾相连,即前面一个字符串的最后一个字母和紧跟着的字符串的第一个字母相同。
例如,给定arr[][] = {"gj","jl","dg","ad","gg"}
,可知其满足首尾相连,即ad, dg, gg, gj, jl
。
代码如下:
#include <cstring>
#include <iostream>
using namespace std;
bool flag = false;
void swap(char **arr, int s, int i);
void fun(char **arr, int n, int k);
bool judge(char **arr, int n);
int main() {
int n;
cin >> n;
char **arr = new char*[n];
for (int i = 0; i < n; ++i) {
arr[i] = new char[100];
memset(arr[i], 0, sizeof arr[i]);
cin >> arr[i];
}
cout << judge(arr, n) << endl;
return 0;
}
bool judge(char **arr, int n) {
fun(arr, n, 0);
if (flag)
return true;
else
return false;
}
void fun(char **arr, int n, int k) {
if (k == n) {
//for (int i = 0; i < n; ++i)
// cout << arr[i] << '\t';
//cout << endl;
flag = true;
return;
}
for (int i = k; i < n; ++i) {
if (k > 0 && (arr[k-1][strlen(arr[k-1])-1] == arr[i][0])) { //k!=0,之前的0-k-1个字符串已经排好序,则判断k-1号字符串与之后的字符串
swap(arr, k, i);
fun(arr, n, k+1);
swap(arr, k, i);
}
else if ( k==0 ) { //k=0,即第一个字符串与所有的字符串判断
swap(arr, k, i);
fun(arr, n, k+1);
swap(arr, k, i);
}
else
;
}
return;
}
void swap(char **arr, int s, int i) {
char *t = new char[100];
memset(t, 0, 100);
strcpy(t, arr[s]);
strcpy(arr[s], arr[i]);
strcpy(arr[i], t);
delete[] t;
}
输入参数:
5
gj jl dg ad gg
输出结果:
//ad dg gg gj jl
1
回溯法:以深度优先遍历,一一试探。