由一组字符串对C ++形成一个圆/链

问题描述 投票:0回答:1

所以,我要在C ++中做一个作业,但我不知道该怎么做:/我必须使用回溯,这对我来说是完全陌生的。

问题:您将得到n名及其姓名的人,以及m他们之间的亲戚(朋友)数。每个关系由两个名称组成,形成一对字符串。每个人至少有n / 2个朋友。第一人称有一本书,他借给他的一个朋友。这本书必须“遍历”所有人,并最终交到第一个人的手中。写出所有可能的解决方案。输入应包含n的数字,然后是m的数字,然后是m每个包含关系的行数。

类似这样的东西:

输入...

3 3马特·苏西(Matt Susy)马特·艾伦Susy Alan

...将导致:

马特·苏西·艾伦·马特马特·艾伦·苏西·马特

等等,以供更多人使用。

我一直在把头撞在桌子上,因为无论做什么,我都无法弄清楚://正如我所说的,这对我来说是一个相对较新的概念,将不胜感激:)我无法显示代码,因为...好吧,还没有,我不知道如何以可接受的方式解决问题:/

algorithm graph-algorithm backtracking recursive-backtracking
1个回答
0
投票

不幸的是没有找到that代码,但是我发现了另一种尝试解决该问题的方法。事情是可行的,但我不能提交,因为老师说有人已经使用这种方法解决了这个问题,所以我必须为它提出不同的解决方案。 (信不信由你,这已经发生了太多次了……)基本思想可能与此相似,但是采用另一种方法会更好。请原谅变量的名称,英语不是我的母语,所以我用来自我的语言的单词写了它:)

#include<iostream>
#include<fstream>

using namespace std;

void input_1D(string nev_1D[])
{
     ifstream be("skam0286_L6_9.txt");
     int x, i, j, k=1, ok;
     string akt;
     be>>x>>x;
     for(i=0; i<2*x; ++i)
     {
          be>>akt;
          for(j=1, ok=1; j<=k; ++j)  if(nev_1D[j]==akt) ok=0;
          if(ok) nev_1D[k++]=akt;
     }
     be.close();
}

void input_2D(int &n, int &m, string nev_2D[][3])
{
  int i;
  ifstream be("skam0286_L6_9.txt");
  be>>n>>m;
  for(i=1;i<=m;++i)  be>>nev_2D[i][1]>>nev_2D[i][2];
    be.close();
}

void output(int n, string eredm[])
{
  int i;
  for(i=1;i<=n;i++) cout<<eredm[i]<<" ";
  cout<<endl;
}

bool helyes(int n, string akt, string eredm[])
{
  int i, ok=0;
  for(i=1; i<n && !ok; ++i)
    if(eredm[i]==akt) ok=1;
  return ok;
}

bool barat(int m, string nev_2D[][3], string n1, string n2)
{
  int i, ok=0;
  for(i=1;i<=m && !ok; ++i)
    if((n1==nev_2D[i][1] && n2==nev_2D[i][2])||(n1==nev_2D[i][2] && n2==nev_2D[i][1]))
       ok=1;
  return ok;
}

void bt(int n, int m, string nev_2D[][3], string nev_1D[], string eredm[], int ind)
{
  if(ind==n+1){
    if(barat(m, nev_2D, eredm[1], eredm[ind-1])){
      eredm[ind]=eredm[1];
      output(ind, eredm);
    }
  }
  else{
    int i;
    for(i=1; i<=n; ++i)
      if(!helyes(ind, nev_1D[i], eredm) && barat(m, nev_2D, eredm[ind-1], nev_1D[i])){
        eredm[ind]=nev_1D[i];
        bt(n, m, nev_2D, nev_1D, eredm, ind+1);
      }
  }
}

int main()
{
  int n, m;
  string nev_2D[100][3], nev_1D[100], eredm[100];
  eredm[1]="Laci";
  input_2D(n,m,nev_2D);
  input_1D(nev_1D);
  bt(n, m, nev_2D, nev_1D, eredm, 2);
  return 0;
}
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.