Head to Tail ordering

Problem:A head to tail ordering of strings is the one in which the last letter of the previous word is the same as the first letter of the following word. For eg. ‘Angularcan be followed by ‘ rotation’.

The task is to write a code to accept a set of finite strings and determine if such an ordering is possible by arranging them in a head to tail sequence.

Link

#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <cstdio>

using namespace std;
map<string,int> mp;
map<int,string> pm;
vector<string> vb[27];
int res[105];
int t,n;

bool dfs(bool vis[],int v,int cnt)
{
    if(cnt==n-1)
    {
        return 1;
    }
    string s=pm[v];
    int idx=(s[s.size()-1]-'a')+1;
    // vis[v]=1;
    bool f=0;
    for(int i=0;i<vb[idx].size();i++)
    {
        s=vb[idx][i];
        if(vis[mp[s]]==0)
        {
            vis[mp[s]]=1;
            res[cnt+1]=mp[s];
            f=dfs(vis,mp[s],cnt+1);
            vis[mp[s]]=0;
            if(f)
            return 1;
        }
    }
    return 0;
}
int main() {
	//code
	bool vis[105];
	scanf("%d",&t);
	string str;
	int idx;
	bool f;
	while(t--)
	{
	    scanf("%d",&n);
	    mp.clear();
	    pm.clear();
	    f=0;
	    for(int i=1;i<27;i++)
	        vb[i].clear();
	    for(int i=1;i<=n;i++)
	    {
	        cin>>str;
	        mp[str]=i;
	        pm[i]=str;
	        vis[i]=0;
	        idx=(str[0]-'a')+1;
	        vb[idx].push_back(str);
	    }
	    for(int i=1;i<=n;i++)
	    {
	        if(vis[i]==0)
	        {
	           res[0]=i;
	           vis[i]=1;
	           f=dfs(vis,i,0);
	           vis[i]=0;
	        }
	        if(f)
	        break;
	    }
	    if(f)
	    printf("Head to tail ordering is possible.\n");
	    else
	    printf("Head to tail ordering is not possible.\n");
	}
	return 0;
}

 

Comments are closed.