中兴模拟笔试的时候遇到的题目,说是之前acm大赛的题目
题目描述
判定确定能否将一组单词排列在一个列表中,使得任何单词首字母与前面单词尾字母相同:函数canArrangeWords的输入应该包含一个整数num(1<=num<=100)和一个单词阵列arr,阵列元素是由所有小写字母组成的单词。单词长度为2-100之间,可取到2和100。能排列成功,返回1,不成功返回-1;
#思路
这个很像之前说的字符串全排列,用字符串全排列的方法也确实可以做出来,不过加了个flag进去,这样一旦找到一个符合条件的序列,就不继续寻找了。
#code
#include <cstring>
#include <iostream>
using namespace std;
int flag = 0;
void quanpailie1(char **arr, int n, int k) {
if (k == n) {
//不需要看输出结果就可以将下面的注释掉
for (int i = 0; i < n; ++i)
cout << arr[i] << '\t';
cout << endl;
flag = 1;
return;
}
for (int i = k; i < n; ++i) {
if (flag==0&&k > 0 && (arr[k-1][strlen(arr[k-1])-1] == arr[i][0])) { //k!=0,之前的0-k-1个字符串已经排好序,则判断k-1号字符串与之后的字符串,找到能够满足条件的i,将其和k的位置互换,flag如果等于1,代表已经找到了,不用找了,不然会找到所有满足条件的排列为止。
swap(arr[k],arr[i]);
quanpailie1(arr, n, k+1);
swap(arr[k],arr[i]);
}
else if ( k==0 ) {
//当k=0,前方无元素,所以将第一个元素挨个和后面的元素换一次,因为不确定成功的答案在哪个开头的数组里。
swap(arr[k],arr[i]);
quanpailie1(arr, n, k+1);
swap(arr[k],arr[i]);
}
else
continue;
}
return;
}
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, 100);
cin >> arr[i];
}
quanpailie1(arr, n, 0);
system("pause");
if (flag)
return true;
else
return false;
}