Итак, у меня есть задание, которое нужно выполнить в C ++ , но я не могу понять, как: / Я должен использовать возврат, который совершенно чужд мне.
Проблема: Вам дано n количество людей с их именами и m количество отношений ( друзья) между ними. Каждое отношение состоит из двух имен, образующих пару строк. У каждого есть как минимум n / 2 друзей. У первого человека есть книга, которую он одалживает одному из своих друзей. Книга должна «путешествовать» через каждого и оказаться в руках первого лица. Запишите все возможные решения. Входные данные должны содержать число для n , за которым следует число для m , за которым следует m количество строк, каждая из которых содержит отношение.
Примерно так:
Вход ...
3 3 Мэтт Сьюзи Мэтт Алан Сьюзи Алан
... приведет к:
Мэтт Сьюзи Алан Мэтт Мэтт Алан Сьюзи Мэтт
и так далее для большего количества людей.
Я бился головой о стол, потому что, что бы я ни делал, я не могу понять это: / Как я уже сказал, это относительно новая концепция для меня, и каждая маленькая помощь будет оценена :)
Дело в том, что этот код работает, но я не могу представить его, потому что учитель сказал, что кто-то уже подошел к этой проблеме, используя этот метод, поэтому я должен найти другое решение для него. (Хотите верьте, хотите нет, это уже случалось слишком много раз ...) Базовая идея может иметь некоторое сходство с этой, но другой подход был бы лучше. Пожалуйста, простите имена переменных, engli sh не мой родной язык, поэтому я написал его, используя слова из моего языка:)
#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]="Matt";
input_2D(n,m,nev_2D);
input_1D(nev_1D);
bt(n, m, nev_2D, nev_1D, eredm, 2);
return 0;
}