Формирование круга / цепочки из набора пар строк C ++ - PullRequest
1 голос
/ 12 февраля 2020

Итак, у меня есть задание, которое нужно выполнить в 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...