Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2013, 00:09   #1
ELaX
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 29
Печаль Укажите ошибку С++

Задача такая: Упорядочить строки целочисленной прямоугольной матрицы по возрастанию количества одинаковых элементов в каждой строке.
Найти номер первого из столбцов, не содержащих ни одного отрицательного элемента.
Вот мой код.
Код:
Код:
#include <iostream>

using namespace std;

int main(void)
{
	int i, j, n, m,e,max,temp,k=0;

cin >> n >> m;
    int *a=new int[m];
	int *bi=new int[m];

    int **matrix = new int*[n];
    for (i = 0; i < n; i++)
        *(matrix + i) = new int[m];
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++) 
           cin >> *(*(matrix + i) + j);
		for (i = 0; i < n; i++){
        for (j = 0; j < m; j++){		
			a[i]=0;
			for (e = 0; e < m; e++){
				if (matrix[i][j] == matrix[i][e]) {a[i]=a[i]+1;bi[i]=matrix[i][e];}
		}}}
	for (i=0; i<n; i++){
		max=a[i];
		int index=i;
			for (j=i+1; j<n; j++){
				if (a[j]<max)
				{
					max=a[j];
					index=j;				
				}
				temp=a[i];
				a[i]=max;
				a[index]=temp;
				for (e=0; e<m; e++){
		temp=matrix[i][e];
		matrix[i][e]=matrix[index][e];
		matrix[index][e]=temp;
	}}}
for (i=0; i<n; i++){
for (j = 0; j < m; j++){
		
            cout << *(*(matrix + i) + j) << ' ';
}
        cout << endl;

}
	for (j=0; j<m; j++){
		k=0;
for (i = 0; i < n; i++){
	if (matrix[i][j]>=0) k=k+1;
} 
if (k>n-1)  cout << j+1 << endl;
	}
    return 0;
	}
Входные данные.
4 5-размер
-5 6 0 -1 -5
-1 1 0 -5 0
-5 0 4 1 1
-1 -5 0 -5 -5
У меня получается
-5 6 0 -1 -5
-1 1 0 -5 0
-5 0 4 1 1
-1 -5 0 -5 -5
3
Должно быть
-1 1 0 -5 0
-5 0 4 1 1
-5 6 0 -1 -5
-1 -5 0 -5 -5
3
Я не могу понять по какому принципу происходит сортировка...
Помогите пожалуйста, где у меня не так... .
ELaX вне форума Ответить с цитированием
Старый 25.11.2013, 06:03   #2
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Зуб даю, если писать комментарии, сам бы давно уже разобрался. Если же нет, другим было бы намного легче найти ошибку. Это так, мысли вслух.
Проблем однака: условие "по возрастанию количества одинаковых элементов в каждой строке" условие неоднозначное.
Например строка: [3,3,4,5,5,5]. Сколько здесь одинаковых элементов? 2 (3 и 3)? 3 (5,5,5)? Или 5 (3,3,5,5,5)? Как правильно трактовать?

Последний раз редактировалось nikmoon; 25.11.2013 в 06:20.
nikmoon вне форума Ответить с цитированием
Старый 25.11.2013, 08:54   #3
ELaX
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 29
По умолчанию

Именно это я и хотел бы узнать. Я написал что нужно вводить и что должно получится. Я понять не могу как нужно сортировать матрицу чтобы вышло такое... Если по кол-ву одинаковых элементов в строке то первые 3 не должны были бы меняться однако они меняются. Пробовал по убыванию ещё но там -5 0 4 1 1 в строке на 1 месте оказываются а нужно -1 1 0 -5 0.
ELaX вне форума Ответить с цитированием
Старый 25.11.2013, 09:07   #4
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Ты меня не понял, ну да ладно, я тебя понял
Ща попробую.
nikmoon вне форума Ответить с цитированием
Старый 25.11.2013, 09:42   #5
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Код:
#include <iostream>

using namespace std;


// вывод содержимого матрицы
void show_matrix(int **matrix, int rows, int cols);

// поиск количества одинаковых элементов в строке
int equal_count(int *row, int cc);

int main(void)
{
	int i, j, n, m;

	cin >> n >> m;
	int *a = new int[n];

	// создаем матрицу n x m
	int **matrix = new int*[n];
	for (i = 0; i < n; i++)
		*(matrix + i) = new int[m];

	// заполняем матрицу
	for (i = 0; i < n; i++)
		for (j = 0; j < m; j++) 
			cin >> *(*(matrix + i) + j);

	// для каждой строки найдем количество одинаковых элементов
	// и сохраним найденные значения в массиве a
	for (i = 0; i < n; i++)	// цикл по строкам
	{
		a[i] = equal_count(matrix[i], m);
	}
	
	// теперь нужно сделать сортировку строк по возрастанию количества одинаковых элементов
	// пузырьковый метод, максимальный элемент будет продвигаться в конец
	for(i = 0; i < (n-1); i++)
	{
		for(j = 0; j < (n - 1 -i); j++)
			if (a[j] > a[j+1])
			{
				// меняем местами строки в матрице
				int *tmp_row = matrix[j];
				matrix[j+1] = matrix[j];
				matrix[j] = tmp_row;
			
				// меняем местами элементы в массиве
				int tmp_val = a[j];
				a[j+1] = a[j];
				a[j] = a[j+1];
			}
	}
	
	show_matrix(matrix, n, m);

	return 0;
}

// вывод содержимого матрицы
void show_matrix(int **matrix, int rows, int cols)
{
	for(int i = 0; i < rows; i++)
	{
		for(int j = 0; j < cols; j++)
		{
			cout << matrix[i][j] << " ";
		}
		cout << endl;
	}
}

// поиск количества одинаковых элементов в строке
int equal_count(int *row, int cc)
{
	int max_count = 0;

	// выберем тупой и быстрый для реализации метод
	// для каждого элемента строки будет считать число одинаковых элементов
	// по-моему так и было сделано, но сильно не вдавался
	for(int i = 0; i < cc; i++)	// берем каждый элемент
	{
		int curr_count = 0;
		for(int j = 0; j < cc; j++)
		{
			if (row[i] == row[j]) // сравниваем с каждым элементом
			{
				curr_count++;
			}
		}
		
		// сохраняем максимум
		if (curr_count > max_count)
			max_count = curr_count;
	}
	
	return max_count;
}
Сделал только сортировку строк. Правиряй
nikmoon вне форума Ответить с цитированием
Старый 25.11.2013, 09:51   #6
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Блин, я протестил, выводит все то же самое, что и у тебя )))
Я тебе даже больше скажу, вывод ВЕРНЫЙ )))
Почему это так надеюсь догадаешься.
nikmoon вне форума Ответить с цитированием
Старый 25.11.2013, 11:28   #7
ELaX
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 29
По умолчанию

от того что верный мне легче не становится. другие разные примеры получаются. но блин мне нужно чтоб вывод был именно таким( Онлайн проверяется там машину не убедишь что так по идее тоже верно)). Отсортировать по разному я могу но я не понимаю принцип как выходит такой ответ
-1 1 0 -5 0
-5 0 4 1 1
-5 6 0 -1 -5
-1 -5 0 -5 -5
Я уже мозг сломал)
ELaX вне форума Ответить с цитированием
Старый 25.11.2013, 11:42   #8
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Ладно, объясняю.
в первой строке два одинаковых элемента 0 и 0
во второй два одинаковых 1 и 1
в третьей два одинаковых -5 и -5
в четвертой три одинаковых -5, -5 и -5.
Потому так и выводится.
Вывод, который нужен тебе получится, только если задать условие, что считается не максимальное число одинаковых элементов в строке, а число элементов -5.
nikmoon вне форума Ответить с цитированием
Старый 25.11.2013, 12:31   #9
ELaX
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 29
По умолчанию

это будет подгонка под ответ этой матрицы. Там после неё идёт тест 2
входные
3 4
-2 0 4 0
6 -8 1 1
0 -3 5 1
Должно получится
0 -3 5 1
6 -8 1 1
-2 0 4 0
3
Так что по отрицательным тут как бы не то... Тут как то по дикообразному сортируется
ELaX вне форума Ответить с цитированием
Старый 25.11.2013, 12:53   #10
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Для компьютера абсолютно фиолетово, что должно получиться.
Он выполняет алгоритм. Алгоритм точно соответствует условию задачи.
Если по-твоему должно получиться что-то другое...
Ты можешь не согласиться с компьютером, но это мало что изменит.
nikmoon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Укажите ошибку С++ ELaX Помощь студентам 8 25.11.2013 13:13
Укажите ошибку bad9 Помощь студентам 3 11.06.2012 03:23
укажите на ошибку маГГ85 JavaScript, Ajax 2 23.02.2012 13:15
Укажите на ошибку. Wh15per Общие вопросы C/C++ 2 27.12.2011 20:02
Укажите ошибку kerbeross PHP 7 25.08.2009 21:47