所以,我要在C ++中做一个作业,但我不知道该怎么做:/我必须使用回溯,这对我来说是完全陌生的。
问题:您将得到n名及其姓名的人,以及m他们之间的亲戚(朋友)数。每个关系由两个名称组成,形成一对字符串。每个人至少有n / 2个朋友。第一人称有一本书,他借给他的一个朋友。这本书必须“遍历”所有人,并最终交到第一个人的手中。写出所有可能的解决方案。输入应包含n的数字,然后是m的数字,然后是m每个包含关系的行数。
类似这样的东西:
输入...
3 3马特·苏西(Matt Susy)马特·艾伦Susy Alan
...将导致:
马特·苏西·艾伦·马特马特·艾伦·苏西·马特
等等,以供更多人使用。
我一直在把头撞在桌子上,因为无论做什么,我都无法弄清楚://正如我所说的,这对我来说是一个相对较新的概念,将不胜感激:)我无法显示代码,因为...好吧,还没有,我不知道如何以可接受的方式解决问题:/
不幸的是没有找到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;
}