Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> королева и шахматы, диагонали для королевы 
V
    Опции темы
kelario
Дата 8.11.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 19.9.2008

Репутация: нет
Всего: нет



Доброе время суток.
Помогите с задачкой плз,у кого время\желание есть и кому не лень.
Значит есть шахматная доска.Вводятся 2 числа,вернее координата,буква и цифра.
На клетку,которая введена ставится дамка.Задача программы показать,в каких направлениях может двигаться дамка.То есть программа должна отметить все клетки,находящиеся с верху,с низу,с лева,с права и по диагонали от введённой клетки.С верхом\низом\сторонами проблем не оказалось,а вот,что делать с диагоналями я не знаю :( 
Код
                                                        
int main()
{
char a,i,b,v,g,l;
int e;

char mas[8][8];
cout <<"vvedite bukvu"<<endl;
cin >>a;
cout <<"vvedite 4islo"<<endl;
cin >>b;


mas[i][v];
v='1';
for (v='8';v>'0';v--)
{
if (v==b){
for (e=1;e<9;e++)
cout <<"x"; }
else
for(i=97;i<105;i++)
{
//l=b+49;
//g=(l-a);
//if (i==(a-2) || i==(a+2)) cout <<"x";
if (i==a) cout <<"x";
else cout <<'0';    }
cout <<""<<endl;
}


У меня была идея,но как её развить я не знаю,и возможно ли таким способом это  сделать вообще.(сама идея в закомментированых  строках)
PM MAIL   Вверх
mes
Дата 8.11.2008, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



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

2. вначале в цикле проходите горизонталь, взяв  вертикальную координату от  позиции королевы,
потом аналогично проходите вертикаль. 
С  диагоналями чуть сложнее, 
а) можно просто пройтись в 4 стороны, следя за границой доски, прибавляя (1,1)  (-1,1) (1,-1) (-1,-1)  сответствено
б) найти начало диагонали и двигаться от них.


Это сообщение отредактировал(а) mes - 8.11.2008, 15:00


--------------------
PM MAIL WWW   Вверх
mes
Дата 8.11.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(kelario @  8.11.2008,  13:59 Найти цитируемый пост)
что делать с диагоналями я не знаю :( 

вот условный пример для проверки  по 4м диагональным направлениям
Код

#define BoardLen 8
#define FirstH 1
#define LastH 8
#define FirstV 1
#define LastV 8 

bool OnBoard (int x, int y)
{
 return ((x>=FirstH) && (x<=LastH) && (y>=FirstV) && (y<=LastV)) ? true : false; 
}
...

int x = 5;
int y =4; // условные координаты королевы

for (int i=1; x<=BoardLen; ++i ) // этот цикл нужно разбить на 4 , с расчетом реальной длины диагонали. 
{ 
   int x1 = x+i;
   int y1 = y+i;  //двигаемся вверх и вправо

   if (OnBoard (x1,y1)) ... // если координата на доске, то 

   int x2 = x-i;
   int y2 = y+i; //двигаемся вверх и влево

   if (OnBoard (x2,y2)) ... // если координата на доске, то 

   int x3 = x-i;
   int y3 = y-i; //двигаемся  вниз и влево

   if (OnBoard (x3,y3)) ... // если координата на доске, то 

   int x4 = x+i;
   int y4 = y-i; //двигаемся вниз и вправо 

   if (OnBoard (x4,y4)) ... // если координата на доске, то 
};


Это сообщение отредактировал(а) mes - 8.11.2008, 16:02


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 8.11.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Предлагаю такой алгоритм. Раз уж мы идем сверху вниз и слева направо на каждой клетке проверяем условия:

Перед каждым началом прохода по линии определяем расстояние по Y от текущей линии до королевы. Предположим мы на 2ой линии, а королева на 5ой. Значит расстояние 5-2 = 3. Операцию надо проводить по модулю, т.е. если мы на линии 8, а королева на 5ой линии, то - 5-8 = [-3]. Знак числа надо опустить (можно использовать функцию abs())

Далее берем позицию X королевы. Пусть будет тоже 5. Тогда вычитаем позицию королевы по X (5) и расстояние по Y до проверяемой ячейки (3),  5-3 = 2. Запоминаем это значение в переменную leftDiag.

Узнаем вторую точку на проверяемой линии, справа от королевы. Схема таже, только теперь 5+3=8.
Заносим в rightDiag.

Теперь при проходе по кажой ячейке на строке выполняем условие:

Код

if (i==leftDiag || i==rightDiag) cout <<"x";


При попадании на строку с королевой - диагонали попадут именно на позицию X королевы (5+0).

Это сообщение отредактировал(а) SABROG - 8.11.2008, 18:33


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
kelario
Дата 9.11.2008, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 19.9.2008

Репутация: нет
Всего: нет



Спасибо!! В итоге всё получилось!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0461 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.