字符串数组首尾字符相同

中兴模拟笔试的时候遇到的题目,说是之前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;

}