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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2009, 01:17   #1
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию Слоны

Помогите с алгоритмом...требуется расставить 8 слонов на шахматном поле так чтобы каждое поле находилось под ударом одного из них...нужно найти все варианты. Сама задача не сложная конечно...но вот если реализовывать полный перебор к примеру, то там получается туева куча вариантов...это хорошая нагрузка...может кто-то подсказать более экономный вариант?
[MI_nor] вне форума Ответить с цитированием
Старый 07.08.2009, 01:25   #2
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Цитата:
чтобы каждое поле находилось под ударом одного из них...
Может чтобы они друг друга не били (обычно так задача ставилась)
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 07.08.2009, 01:31   #3
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

Цитата:
Сообщение от ISergeyN Посмотреть сообщение
Может чтобы они друг друга не били (обычно так задача ставилась)
Ну можно и так, хотя смысл практически один и тот-же
[MI_nor] вне форума Ответить с цитированием
Старый 07.08.2009, 01:39   #4
TAVulator
Программист
Форумчанин
 
Аватар для TAVulator
 
Регистрация: 23.07.2009
Сообщений: 101
По умолчанию

Цитата:
Помогите с алгоритмом...требуется расставить 8 слонов на шахматном поле так чтобы каждое поле находилось под ударом одного из них...нужно найти все варианты.
Я тебе так скажу - 16 вариантов.
Нужно слоны поставить в одну линию. Таких возможностей всего 16.
Если ошибаюсь - поправьте. Хочу узнать еще варианты как поставить слонов )))
Если вы верите, что можете или не можете
сделать что-то, вы правы в обоих случаях.

______________________________(С) Г.Форд
TAVulator вне форума Ответить с цитированием
Старый 07.08.2009, 01:42   #5
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Цитата:
Нужно слоны поставить в одну линию. Таких возможностей всего 16.
Цитата:
Небольшая программа за считанные минуты выдаст вам около 90 таких позиций, например, вот такую:...
Код:
#include <iostream>
void addqueen();

int col[8], up_free[15], dn_free[15], coln[8] ;
int main()
{            
	int i ;

	for ( i = 0 ; i <= 7 ; i++ )
		col[i] = 1 ;
	for ( i = 0 ; i <= 14 ; i++ )
		up_free[i] = dn_free[i] = 1 ;
	system("cls");
	addqueen( ) ;  
	return 0;
}            

void addqueen( )            
{            
	int i, c, r ;            
	static int comb, row = -1 ;

	row++ ;

	/* Проверяем колонки */            
	for ( i = 0 ; i <= 7 ; i++ )            
	{            
		/* если клетка не находится под ударом */            
		if ( col[i] && up_free[i+row] && dn_free[row-i+7])
		{            
			/* запоминаем, что в строке находится ферзь */
			coln[row] = i ;

			/* маркируем колонку и диагональ */ 
			col[i] = 0 ;             
			up_free[i+row] = 0 ;             
			dn_free[row-i+7] = 0 ;

			/* если заполнены все строки */            
			if ( row >= 7 )            
			{            
				comb++ ;            
				printf ( "\n\n\ncombination no. %d", comb ) ;
				for ( r = 0 ; r <= 7 ; r++ )
				{            
					printf ( "\n" ) ;            
					for ( c = 0 ; c <= 7 ; c++ )
					{            
						if ( c == coln[r] )            
							printf ( " Q " ) ;
						else            
							printf ( " . " ) ;
					}            
				}            
			}            
			else            
				addqueen( ) ;

			/* снимаем пометку с колонки и диагонали */            
			col[ coln[row] ] = 1 ;            
			up_free[ row + coln[row] ] = 1 ;            
			dn_free[ row - coln[ row ] + 7 ] = 1 ;            
		}            
	}            
	row-- ; /* уменьшаем счетчик строк, пробуем следующую комбинацию */
}
Вот глянь (ели не видел..) http://www.codenet.ru/progr/alg/ferzi.php
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 07.08.2009, 01:49   #6
TAVulator
Программист
Форумчанин
 
Аватар для TAVulator
 
Регистрация: 23.07.2009
Сообщений: 101
По умолчанию

глянул.
Цитата:
Зная, что ферзь бьет по вертикали, горизонтали и диагонали
В этой программе речь идет о ферзях (дамах), а тут речь идет о слонах. На сколько помню - слоны бьют только по диагонали.
Если вы верите, что можете или не можете
сделать что-то, вы правы в обоих случаях.

______________________________(С) Г.Форд
TAVulator вне форума Ответить с цитированием
Старый 07.08.2009, 02:01   #7
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Цитата:
В этой программе речь идет о ферзях (дамах), а тут речь идет о слонах. На сколько помню - слоны бьют только по диагонали.
Точно.. напутал (просто когда учили в шахматы то все фигуры по другому называли.. )
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 07.08.2009, 02:01   #8
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

Да не совсем, вариантов там больше 16) стандартные 16(как вы сказали) + например вот такой вариант...
Код:
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0
[MI_nor] вне форума Ответить с цитированием
Старый 07.08.2009, 02:18   #9
TAVulator
Программист
Форумчанин
 
Аватар для TAVulator
 
Регистрация: 23.07.2009
Сообщений: 101
По умолчанию

Цитата:
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0
а теперь посмотри как твои слоны могут ходить (красные нули).
и если я поставлю фигуру в зеленую ячейку, то фигура останется жива, т.к. она находится не под ударом слона.
хотя в задаче написано:
Цитата:
так чтобы каждое поле находилось под ударом одного из них
Если вы верите, что можете или не можете
сделать что-то, вы правы в обоих случаях.

______________________________(С) Г.Форд
TAVulator вне форума Ответить с цитированием
Старый 07.08.2009, 02:29   #10
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

Код:
0 1 0 0 0 0 0 0
0 0 0 0 0 1 0 0
1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0
Эм, как ходят Ваши слоны? Я привык что они могут ходить вправо/влево/вверх/вниз по всей ширине доски) тогда получается что если поставить слона как Вы говорили(зеленый) то его будет бить слон(красный)...
З.Ы но такой вариант не приемлем ввиду того что условие "ОДНОГО из них" не выполняется, несмотря на то что кадое поле под "ударом"...

Последний раз редактировалось [MI_nor]; 07.08.2009 в 02:33.
[MI_nor] вне форума Ответить с цитированием
Ответ


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