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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2012, 02:25   #1
ZavriK
Пользователь
 
Регистрация: 04.04.2011
Сообщений: 12
По умолчанию Двумерный массив

Доброго времени суток.
Возникла такая проблема.Нужно сделать так, чтобы в матрице в каждой строке и столбце элемент встречался один раз.Изначально матрица заполняется рандомно.
Смог написать функцию, с помощью которой в строках нет одинаковых элементов, и ещё одну функцию для столбцов. Не знаю, как их соединить.
По строкам:
Код:
for (int i = 0;i < N;i++){
				for (int j =0;j < N;j++) {
					for (int y =0;y < N;y++){
						if ((table[i][y] == table[i][j]) && (j!=y))
							do {
								table[i][j] = rand() %9 + 1;
							}while(ByLines(table,table[i][j],i,j));
					}

				}
		}

Код:
int ByLines(Matrix9x9 mas,int digit,int index,int jindex)
	{
		for (int j =0;j < N;j++)
			if ((mas[index][j] == digit) && (jindex !=j))
				return 1;
		return 0;
	}



По столбцам:
Код:
for (int j = 0;j < N;j++){
				for (int i =0;i < N;i++) {
					for (int y =0;y < N;y++){
						if ((table[y][i] == table[i][j]) && (i!=y))
							do {
								table[i][j] = rand() %9 + 1;
							}while(ByColumns(table,table[i][j],j,i));
					}

				}
		}


Код:
int ByColumns(Matrix9x9 mas,int digit,int jindex,int index)
	{
		for(int i=0;i<N;i++)
			if((mas[i][jindex] == digit) && (index !=i))
				return 1;
		return 0;
	}
ZavriK вне форума Ответить с цитированием
Старый 09.11.2012, 09:05   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

(Немного странные, не "говорящие" названия функций проверки, ну да ладно)
Напишите функцию IsNotPreviousMatch, которая бы так же принимала матрицу, элемент и его координаты и возвращала бы true, только если элемент не совпадал бы с предыдущими элементами ни в строке, ни в столбце.
В функции заполнения при этом тройной цикл не нужен: просто для каждого элемента пытаетесь задать его случайное значение, пока функция не вернёт true.

Это решение "в лоб", основанное на Вашем и требующее, чтобы спектр возможных значений элементов превышал бы сумму размеров матрицы. Обратите внимание, что, если матрица 9х9 и элементы от 1 до 9, то с очень высокой вероятностью Вы в какой-то момент получите при этом бесконечный цикл. Магические квадраты составляются иначе.
Abstraction вне форума Ответить с цитированием
Старый 09.11.2012, 13:36   #3
ZavriK
Пользователь
 
Регистрация: 04.04.2011
Сообщений: 12
По умолчанию

Благодарю.
ZavriK вне форума Ответить с цитированием
Старый 09.11.2012, 17:29   #4
ZavriK
Пользователь
 
Регистрация: 04.04.2011
Сообщений: 12
По умолчанию

Попытался сделать так,как вы предложили.
Однако,программа зацикливается ,не понимаю почему.
Код:
void CreateTable(){
		for (int i =0;i < N;i++)
			for (int j =0;j < N;j++)
				table[i][j] = rand () %9 + 1;
		for (int i =0;i < N;i++)
			for (int j =0;j < N;j++)
				do {
					table[i][j] = rand()%9 + 1;
				}while(IsNotPreviousMatch(table,table[i][j],i,j));
	}
Код:
bool IsNotPreviousMatch(Matrix9x9 mas,int data,int index,int jindex) {
		int count = 0;
		for (int j =0;j < jindex;j++)
			if (mas[index][j] == mas[index][jindex])
				count++;
		for (int i =0;i < index;i++)
			if (mas[i][jindex] == mas[index][jindex])
				count++;
		if (count > 0) 
			return true;
		else
			return false;
	}
ZavriK вне форума Ответить с цитированием
Старый 09.11.2012, 17:36   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

На примере таблицы 3х3:
Код:
1 2 3
2 1 ?
* * *
При попытке подставить на место ? значение от 1 до 3 программа по очевидным причинам уйдёт в бесконечный цикл, о чём мной уже сказано выше. То есть, для того, чтобы Ваш код (вернее, сам подход, им выражаемый - фатальных "технических" ошибок в коде нет) работал, N должно быть не больше 5.
Abstraction вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# Двумерный массив. Gray_Jagger Помощь студентам 3 29.10.2011 10:14
Одномерный массив и Двумерный массив eugene1437 Общие вопросы C/C++ 15 25.05.2011 19:17
Двумерный массив jUvkeE Помощь студентам 2 03.02.2011 22:08
двумерный массив. Женечка92 Помощь студентам 1 24.04.2010 06:12
Двумерный массив, одномерный массив. Branbal Помощь студентам 14 18.11.2009 12:40