Przydział zadań - algorytm węgierski

0

Potrzebuję pomocy z algorytmem przydziału zadań metodą węgierską. W moim programie są zrobione jego 2 kroki. Nie wiem jak zrobić kolejne kroki (w sumie są 4). Wielkim programistą nie jestem, więc nie oczekujcie cudów ;)

<code=c++>
#include <cstdlib>
#include <conio.h>
#include <iostream>
#include <ctime>
#include <fstream>
#include <string.h>
#include <cstdio>

using namespace std;

struct Zadanie
{
int index;
int czas;
};

void WykonajAlgorytym(const int, Zadanie *, Zadanie *);
void WyswietlTablice(int, Zadanie *, Zadanie *);
char WczytajWybor();

int main(int argc, char *argv[])
{
char wybor;
do
{
srand(time(NULL));
wybor = WczytajWybor();
int iloscZadan;
Zadanie *tabM1, *tabM2;
switch(wybor)
{
case '1':
{
char nazwaPliku[100];
cout << "Podaj nazwe pliku: ";
cin >> nazwaPliku;
strcat(nazwaPliku, ".txt");
ifstream plik;
plik.open(nazwaPliku, std::ios::in);
string napis;
getline(plik, napis);
char * chr = _strdup(napis.c_str());
int nIloscZadan = atoi(chr);
tabM1 = new Zadanie [nIloscZadan];
tabM2 = new Zadanie [nIloscZadan];
for(int j = 0; j < nIloscZadan; j++)
{
string napis;
getline(plik, napis);
chr = _strdup(napis.c_str());
tabM1[j].czas = atoi(chr);
tabM1[j].index = j;
}
for(int j = 0; j < nIloscZadan; j++)
{
string napis;
getline(plik, napis);
chr = _strdup(napis.c_str());
tabM2[j].czas = atoi(chr);
tabM2[j].index = j;
}
WyswietlTablice(nIloscZadan, tabM1, tabM2);
WykonajAlgorytym(nIloscZadan, tabM1, tabM2);
_getch();
}
delete [] tabM1;
delete [] tabM2;
break; // Losowanie danych
case '2':
cout << "Podaj ilosc zdan: ";
do
{
cin >> iloscZadan;
if(iloscZadan <= 0)
cout << "Ilosc zadan musi byc wieksza od zera: \n";
}
while(iloscZadan <= 0);
tabM1 = new Zadanie [iloscZadan];
tabM2 = new Zadanie [iloscZadan];
for(int i = 0; i < iloscZadan; i++)
{
tabM1[i].index = i;
tabM1[i].czas = rand() % 5;
tabM2[i].index = i;
tabM2[i].czas = rand() % 5;
}
WyswietlTablice(iloscZadan, tabM1, tabM2);
WykonajAlgorytym(iloscZadan, tabM1, tabM2);
_getch();
delete [] tabM1;
delete [] tabM2;
break;
}
}
while(wybor != '3');
return EXIT_SUCCESS;
}

char WczytajWybor()
{
char wybor;
do
{
system("cls");
cout << "1) Wczytanie danych z pliku.\n" << "2) Wczytanie danych losowych.\n" << "3) Koniec.\n";
wybor = _getch();
}
while(!(wybor == '1' || wybor == '2' || wybor == '3'));
return wybor;
}

void WyswietlTablice(int n, Zadanie * M1, Zadanie * M2)
{
for(int i = 0; i < n; i++)
{
cout << M1[i].czas << "\t";
}
cout << endl;
for(int i = 0; i < n; i++)
{
cout << M2[i].czas << "\t";
}
cout << endl;
}

void WykonajAlgorytym(const int n, Zadanie * tabM1, Zadanie * tabM2)
{
Zadanie *M1, *M2, temp;
M1 = new Zadanie [n];
M2 = new Zadanie [n];
int iloscM1 = 0, iloscM2 = 0;
for(int i = 0; i < n; i++)
{
if(tabM1[i].czas < tabM2[i].czas)
{
M1[iloscM1].czas = tabM1[i].czas;
M1[iloscM1].index = tabM1[i].index;
iloscM1++;
}
else
{
M2[iloscM2].czas = tabM2[i].czas;
M2[iloscM2].index = tabM2[i].index;
iloscM2++;
}
}
for(int j = iloscM1 - 2, i;j >= 0; j--)
{
temp.czas = M1[j].czas;
temp.index = M1[j].index;
i = j + 1;
while((i < iloscM1) && (temp.czas > M1[i].czas))
{
M1[i - 1].czas = M1[i].czas;
M1[i - 1].index = M1[i].index;
i++;
}
M1[i - 1].czas = temp.czas;
M1[i - 1].index = temp.index;
}
for(int j = iloscM2 - 2, i;j >= 0; j--)
{
temp.czas = M2[j].czas;
temp.index = M2[j].index;
i = j + 1;
while((i < iloscM2) && (temp.czas < M2[i].czas))
{
M2[i - 1].czas = M2[i].czas;
M2[i - 1].index = M2[i].index;
i++;
}
M2[i - 1].czas = temp.czas;
M2[i - 1].index = temp.index;
}
Zadanie *Wynik;
Wynik = new Zadanie [n];
int indexWyniku = 0;
for(int i = 0; i < iloscM1; i++)
{
Wynik[indexWyniku].czas = M1[i].czas;
Wynik[indexWyniku].index = M1[i].index;
indexWyniku++;
}
for(int i = 0; i < iloscM2; i++)
{
Wynik[indexWyniku].czas = M2[i].czas;
Wynik[indexWyniku].index = M2[i].index;
indexWyniku++;
}
cout << endl;
for(int i = 0; i < n; i++)
{
cout << Wynik[i].index << "\t";
}
cout << endl;
cout << "Wyswietla N1: \n";
for(int i = 0; i < iloscM1; i++)
{
cout << M1[i].czas << "\t";
}
cout << endl;
cout << "Wyswietla N2: \n";
for(int i = 0; i < iloscM2; i++)
{
cout << M2[i].czas << "\t";
}
cout << endl;
system("pause");
}
<\code>

0

Tak, ale jak to ugryźć ;) To znaczy zastosować w programie

0

Napisz konkretnie z czym masz problem?
Bo bardziej prymitywny algorytm to tylko sortowanie bąbelkowe.

0

Np. wykreślanie wierszy i kolumn.

0
bool *WykresloneKolumny=new bool[n],*WykresloneWiersze=new bool[n];
for(int i=0;i<n;++i) WykresloneKolumny[i]=WykresloneWiersze[i]=false;
0

A kiedy mam to wywołać w programie? Po wywołaniu funkcji z wykonywaniem algorytmu?

0

Tam gdzie to potrzebujesz.

0

No potrzebuję zrobić cały algorytm krok po kroku, więc wykreślanie kolumn będzie chyba po zerowaniu. Próbowałem i mi nie działa.

0

To pokaż jak próbowałeś.
Może myślisz że tu są sami idioci, którzy uwierzą w bajeczkę: - "Próbowałem i mi nie działa."? Gdyby nawet tak było to od idiotów kiepska "pomoc".

0

I po co takie teksty? Gdybym użytkowników tego forum uważał za idiotów, to nie prosiłbym ich o pomoc ;)

#include <cstdlib>
#include <conio.h>
#include <iostream>
#include <ctime>
#include <fstream>
#include <string.h>
#include <cstdio>

using namespace std;

struct Zadanie
{
    int index;
    int czas;
};
bool *WykresloneKolumny,
*WykresloneWiersze;
void WykonajAlgorytym(const int, Zadanie *, Zadanie *);
void WyswietlTablice(int, Zadanie *, Zadanie *);
char WczytajWybor();

int main(int argc, char *argv[])
{ 
    char wybor;
    do
    {
        srand(time(NULL));
        wybor = WczytajWybor();
        int iloscZadan;
        Zadanie *tabM1, *tabM2;
        switch(wybor)
        { 
            case '1': 
                {
                    char nazwaPliku[100];
                    cout << "Podaj nazwe pliku: ";
                    cin >> nazwaPliku;
                    strcat(nazwaPliku, ".txt");                 
                    ifstream plik;
                    plik.open(nazwaPliku, std::ios::in);
                    string napis;
                    getline(plik, napis);
                    char * chr = _strdup(napis.c_str());
                    int nIloscZadan = atoi(chr); 
                    tabM1 = new Zadanie [nIloscZadan];
                    tabM2 = new Zadanie [nIloscZadan]; 
                    for(int j = 0; j < nIloscZadan; j++)
                    {
                        string napis;
                        getline(plik, napis);
                        chr = _strdup(napis.c_str());
                        tabM1[j].czas = atoi(chr);
                        tabM1[j].index = j;
                    }
                    for(int j = 0; j < nIloscZadan; j++)
                    {
                        string napis;
                        getline(plik, napis);
                        chr = _strdup(napis.c_str());
                        tabM2[j].czas = atoi(chr);
                        tabM2[j].index = j;
                    }
                    WyswietlTablice(nIloscZadan, tabM1, tabM2);
                    WykonajAlgorytym(nIloscZadan, tabM1, tabM2);
                    _getch();
                }
            delete [] tabM1;
            delete [] tabM2;
            break; // Losowanie danych
            case '2': 
                cout << "Podaj ilosc zdan: ";
                do
                {
                cin >> iloscZadan;
                if(iloscZadan <= 0)
                     cout << "Ilosc zadan musi byc wieksza od zera: \n";
                }
                while(iloscZadan <= 0); 
                tabM1 = new Zadanie [iloscZadan];
                tabM2 = new Zadanie [iloscZadan]; 
                for(int i = 0; i < iloscZadan; i++)
                {
                    tabM1[i].index = i;
                    tabM1[i].czas = rand() % 5;
                    tabM2[i].index = i;
                    tabM2[i].czas = rand() % 5;
                }
                WyswietlTablice(iloscZadan, tabM1, tabM2);
                WykonajAlgorytym(iloscZadan, tabM1, tabM2);
                _getch();
                delete [] tabM1;
                delete [] tabM2;
                break;
        }
    }
    while(wybor != '3');
    return EXIT_SUCCESS;
}

char WczytajWybor()
{
    char wybor;
    do
    {
        system("cls");
        cout << "1) Wczytanie danych z pliku.\n" << "2) Wczytanie danych losowych.\n" << "3) Koniec.\n";
        wybor = _getch();
    }
    while(!(wybor == '1' || wybor == '2' || wybor == '3'));
    return wybor;
}

bool *WykresloneKolumny=new bool[n],*WykresloneWiersze=new bool[n];
{
    bool n;
    for(int i=0;i<n;++i) WykresloneKolumny[i]=WykresloneWiersze[i]=false;
}

void WyswietlTablice(int n, Zadanie * M1, Zadanie * M2)
{
    for(int i = 0; i < n; i++)
    {
        cout << M1[i].czas << "\t";
    }
    cout << endl;
    for(int i = 0; i < n; i++)
    {
        cout << M2[i].czas << "\t";
    }
    cout << endl;
}

void WykonajAlgorytym(const int n, Zadanie * tabM1, Zadanie * tabM2)
{
    Zadanie *M1, *M2, temp;
    M1 = new Zadanie [n];
    M2 = new Zadanie [n];
    int iloscM1 = 0, iloscM2 = 0;
    for(int i = 0; i < n; i++)
    {
        if(tabM1[i].czas < tabM2[i].czas)
        {
            M1[iloscM1].czas = tabM1[i].czas;
            M1[iloscM1].index = tabM1[i].index;
            iloscM1++;
        }
        else
        {
            M2[iloscM2].czas = tabM2[i].czas;
            M2[iloscM2].index = tabM2[i].index;
            iloscM2++;
        }
    } // II krok algorytmu   
    for(int j = iloscM1 - 2, i;j >= 0; j--)      
    {
        temp.czas = M1[j].czas;
        temp.index = M1[j].index;
        i = j + 1;
        while((i < iloscM1) && (temp.czas > M1[i].czas))
        {
            M1[i - 1].czas = M1[i].czas;
            M1[i - 1].index = M1[i].index;
            i++;
        }
        M1[i - 1].czas = temp.czas;
        M1[i - 1].index = temp.index;
    } // sortowanie tablicy M2
    for(int j = iloscM2 - 2, i;j >= 0; j--)
    {
        temp.czas = M2[j].czas;
        temp.index = M2[j].index;
        i = j + 1;
        while((i < iloscM2) && (temp.czas < M2[i].czas))
        {
            M2[i - 1].czas = M2[i].czas;
            M2[i - 1].index = M2[i].index;
            i++;
        }
        M2[i - 1].czas = temp.czas;
        M2[i - 1].index = temp.index;
    } // scalenie tablicy
    Zadanie *Wynik;
    Wynik = new Zadanie [n];
    int indexWyniku = 0;
    for(int i = 0; i < iloscM1; i++)
    {
        Wynik[indexWyniku].czas = M1[i].czas;
        Wynik[indexWyniku].index = M1[i].index;
        indexWyniku++;
    }
    for(int i = 0; i < iloscM2; i++)
    {
        Wynik[indexWyniku].czas = M2[i].czas;
        Wynik[indexWyniku].index = M2[i].index;
        indexWyniku++;
    }
    cout << endl;
    for(int i = 0; i < n; i++)
    {
        cout << Wynik[i].index << "\t";
    }
    cout << endl;
    cout << "Wyswietla N1: \n";
    for(int i = 0; i < iloscM1; i++)
    {
        cout << M1[i].czas << "\t";
    }
    cout << endl; 
    cout << "Wyswietla N2: \n";
    for(int i = 0; i < iloscM2; i++)
    {
        cout << M2[i].czas << "\t";
    }
    cout << endl;
    system("pause");
}
0

Czy cokolwiek rozumiesz w tym kodzie?
Ten fragment co podałem tworzy dynamicznie dwie tablicy z wartościami logicznymi i nadaje im wartości false;
Dalsze użycie:

WykresloneWiersze[y]=true; // wykreśl wiersz o numerze y
WykresloneKolumny[x]=true; // wykreśl kolumnę o numerze x
if(WykresloneWiersze[y]) // wiersz o numerze y - jest wykreślony
if(WykresloneKolumny[x]) // kolumna o numerze x - jest wykreślona
0

No rozumiem, nie wszystko ale staram się jak najwięcej. Instrukcje warunkowe, a gdzie polecenia do wykonania?

0

Masz je (polecenia do wykonania) napisać, no chyba że chcesz gotowca.

1 użytkowników online, w tym zalogowanych: 0, gości: 1