80分求助!!T掉了8,9两个点
  • 板块P1127 词链
  • 楼主战斗天使
  • 当前回复1
  • 已保存回复1
  • 发布时间2020/5/16 22:21
  • 上次更新2023/11/7 02:18:57
查看原帖
80分求助!!T掉了8,9两个点
318285
战斗天使楼主2020/5/16 22:21
现在很崩溃,无论怎么优化还是会卡8,9两个点,心态有点崩溃了,这道题的题解好多都是错的,前几篇只有一篇是对的,其他都是错的..求大佬有空帮忙看一下,如何去优化,或者指点一下,如何找到最开始的单词
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
#define Max 1005
string str[Max];
vector<int > Graph[Max];
vector<string> t; //存放结果
bool flags=false;//是否被访问到
bool flag[Max];//是否被放入t中
int num=0;//放入了几个到t里面了
void dfs(int v,int n);
int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> str[i];
    }
    sort(str+1,str+n+1); //从小到大排好序
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(i!=j&&str[i][str[i].length()-1]==str[j][0])
            {
                Graph[i].push_back(j);
            }
        }
    }

    for(int i=1;i<=n;i++)
    {
        memset(flag,false, sizeof(flag));
        num=1;
        flag[i]=true;
        t.push_back(str[i]);
        dfs(i,n);
        t.clear();
        if(flags)
        {
            break;
        }
    }
    if(!flags)
    {
        cout<<"***";
    }
    return 0;
}

void dfs(int v,int n)
{
    if(flags)
    {
        return ;
    }
    else if(num==n)
    {
        flags=true;
        for(int i=0;i<n;i++)
        {
            cout<<t[i];
            if(i!=n-1)
            {
                cout<<'.';
            }
        }
        return ;
    }

    for(int i=0;i<Graph[v].size();i++)
    {
        if(!flag[Graph[v][i]])
        {
            flag[Graph[v][i]]=true;
            t.push_back(str[Graph[v][i]]);
            num++;
            dfs(Graph[v][i],n);
            flag[Graph[v][i]]=false;
            t.pop_back();
            num--;
        }
    }
}
2020/5/16 22:21
加载中...