Ответить на сообщение
Вернуться к теме
Вы отвечаете на сообщение:
Автор: morgan18 (23.03.2013 в 23:59) По идее функция void Del(Matrix& m); должна удалять дублирующиеся строки, но не удаляет. Как исправить ошибку? Например если массив такой: 1 2 3 4 6 5 3 7 1 2 3 4 1 4 6 5 1 2 3 4 6 5 3 7 то должны остаться только строки: 1 2 3 4 6 5 3 7 1 4 6 5
#include <iostream> #include <iomanip> #include <vector> #include <Windows.h> #include <algorithm> using namespace std; typedef vector<vector<double>> Matrix; void DeleteLine(Matrix& m, int numb); void Sort(Matrix& m, int s); void Del(Matrix& m); void GetMatrix(Matrix m); void GetVector(vector<double> m); bool Equal(vector<double> m, vector<double> m1); int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); int n=3;//Количество деталей double detal=450;//Размер исходной детали double max; vector<double> det;//Размеры деталей double ost, ost_aux; Matrix komb; Matrix kombN; det.push_back(100); det.push_back(30); det.push_back(40); vector<double>::const_iterator largest = min_element(det.begin(), det.end()); for(int i=0; i<det.size(); i++) { for(max = static_cast<int>(detal/det[i]); max>0; max--) { vector<double> tmp(det.size()+1); ost = detal - max*det[i]; if(ost >= *largest) { ost_aux = ost; for(int j=0; j<tmp.size()-1; j++) { if(i!=j) { if(ost_aux >= det[j]) { tmp[j] = static_cast<int>(ost_aux/det[j]); ost_aux -= tmp[j]*det[j]; } else continue; } else tmp[i] = max; } tmp[det.size()] = ost_aux; } else { for(int j=0; j<tmp.size()-1; j++) { tmp[j] = 0; if(i==j) tmp[i] = max; } tmp[det.size()] = ost; } if((tmp[det.size()] != *largest) && (tmp[det.size()] < *largest)) komb.push_back(tmp); } } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //Sort(komb, det.size());//сортируем по отходам cout<<endl; cout<<"Исходная матрица "<<endl; GetMatrix(komb); cout<<endl; cout<<"Всего комбинаций -"<<komb.size()<<endl; Del(komb); cout<<endl; cout<<"Должны остаться по одной из дублирубщих строк"<<endl; GetMatrix(komb); cout<<endl; cout<<"Всего комбинаций -"<<komb.size()<<endl; system("pause"); return 0; } void Del(Matrix& m) { Matrix tmp; tmp.push_back(m[0]); for (int i = 0; i < m.size(); i++) { for (int j = 0; j < tmp.size(); j++) { if(!equal(m[i].begin(), m[i].end(), tmp[j].begin())) { //DeleteLine(m, j); //cout<<" "<<i+1<<" "<<j+1<<"| "; //GetVector(m[i]); tmp.push_back(m[i]); cout<<endl; break; } } } cout<<"tmp="<<endl; GetMatrix(tmp); cout<<"tmp.size="<<tmp.size(); } void GetMatrix(Matrix m) { for(int i=0; i<m.size(); i++) { for(int j=0; j<m[i].size(); j++) cout<<setw(5)<<m[i][j]; cout<<endl; } } void GetVector(vector<double> m) { for(int i=0; i<m.size(); i++) { cout<<setw(5)<<m[i]; } } void Sort(Matrix& m, int s) { for (int i = 0; i < m.size()-1; i++) { for (int j = 0; j < m.size()-2-i; j++) { vector<double> tmp_aux(s+1); //сортировка пузырьком по возрастанию - знак > //сортировка пузырьком по убыванию - знак < if (m[j][s] > m[j + 1][s]) // сравниваем два соседних элемента { // выполняем перестановку элементов массива tmp_aux = m[j]; m[j] = m[j+ 1]; m[j + 1] = tmp_aux; } } } } void DeleteLine(Matrix& m, int numb) { if(!m.empty()) { int n=1; for(Matrix::iterator it_col=m.begin(); it_col!=m.end(); it_col++, n++) if(n==numb) { m.erase(it_col); return; } } } bool Equal(vector<double> m, vector<double> m1) { bool key = true; for(int i=0; i<m.size(); i++) { if(m[i] != m1[i]) { key = false; break; } } return key; }
Ваше имя:
Пароль:
Цитировать Используйте тэги для выделения текста: Код: [code][/code] Жирный: [b][/b] Наклонный: [i][/i] URL: [url][/url]
Сообщение:
Прикрепить: