Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
lenalena
39 / 2 / 1
Регистрация: 04.06.2012
Сообщений: 19
#1

Король и ферзи - C++

08.06.2012, 15:40. Просмотров 1913. Ответов 12
Метки нет (Все метки)

Друзья, пожалуйста помогите с задачкой. Очень нужно. Решите в Borland C++.
На шахматной доске находятся король и несколько ферзей другого цвета. Проверить находится ли король под угрозой и если да, кто ему угрожает. Положение фигур задано массивом К(8,8). 0-клетка пуста, 1-король, 2-ферзь. Ферзь бьет по горизонтали, вертикали и диагоналям.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2012, 15:40     Король и ферзи
Посмотрите здесь:

ферзи - C++
Помогите в написании программы Нужно составить программу определения наименьшего числа ферзей, которые можно расставить на доске так,...

Король шахматной доски - C++
Король шахматной доски размером 8х8 находится на коне в одной из клеток своего королевства. Он очень озабочен тем, что некоторые клетки его...

Определить, может ли король попасть с первой заданной клетки на вторую одним ходом - C++
Шахматный король ходит по горизонтали, вертикали и диагонали, но только на 1 клетку. Даны две различные клетки шахматной доски, определите,...

Определить, может ли король попасть с первой заданной клетки на вторую одним ходом (шахматы) - C++
Доброго времени суток. Начал интересоваться C++ и прохожу онлайн курс. Застопорился на условных операторах вот с такой задачей: ...

Определить, какими пешками можно совершить ход, чтобы черный король не был под ударом ферзей - C++
Задана шахматная доска, содержащая черного короля, черные пешки и белых ферзей. Определить, какими пешками можно совершить ход, чтобы...

На шахматной доске стоят черный король и белые ладья и слон (ладья бьет по горизонтали и вертикали, слон – по - C++
Помогите решить проблему error C2668: fabs: неоднозначный вызов перегруженной функции На шахматной доске стоят черный король и белые...

Пролог-Ферзи-Выполнить задание, опираясь на программу ферзи - Prolog
С помощью предиката ферзи - uazirler (queens) 3-х аргументов, найдите все правильные расстановки ферзей на шахматной доске размером, в...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
S9
Волшебник
645 / 248 / 38
Регистрация: 18.12.2010
Сообщений: 541
08.06.2012, 16:39     Король и ферзи #2
Вообщем алгоритм такой:
1. Записываешь матрицу К (как это будет происходить (там, из файла читаться или ручками вводить или ещё как решать тебе.
2. Находишь координаты ферзей и короля. Это будут просто индексы, под которыми находятся 1 или 2 в массиве. У тебя должен быть массив координат ферзей и координаты короля.
3. Перебираешь массив координат ферзей и проверяешь, может ли ферзь выпилить короля, если может, то пишешь на вывод что то вроде "королю капут" и выходишь из цикла, иначе - ищем дальше.
Условие, которое должно выполняться, чтобы ферзь мог завалить короля выглядит так
(x1 == x2) || (y1 == y2) || (x1 - y1 == x2 - y2) || (x1 + y1 == x2 + y2)
Если также надо узнать, сколько ферзей могут выпилить короля, то можно поставить счетчик, и выход из цикла не делать

Вот как то так..

P.S. Код набросать пока не получится, т.к нету никакого С/C++ компилятора под рукой (может вечером набросаю, просто сейчас я не дома)
qfisher
30 / 30 / 1
Регистрация: 24.05.2012
Сообщений: 156
08.06.2012, 16:43     Король и ферзи #3
Цитата Сообщение от S9 Посмотреть сообщение
т.к нету никакого С/C++ компилятора под рукой
да ладно, есть в винде компилятор.) в поставку с NET идет
Кот Ангенс
317 / 267 / 38
Регистрация: 24.05.2012
Сообщений: 629
08.06.2012, 16:50     Король и ферзи #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <vector>
 
std::vector< std::pair<char, char> > KingAndQueens(const char field[8][8]) {
    typedef std::pair<char, char> pos;
 
    std::vector<pos> q, result;
    pos k;
    char i = 0;
    for (char j; i < 8; i++)
        for (j = 0; j < 8; j++)
            if (field[i][j] == 1)
                k = pos(i, j);
            else if (field[i][j])
                q.push_back(pos(i, j));
    for (i = 0; i < q.size(); i++)
        if (q[i].first != k.first && q[i].second != k.second && /*
        */ q[i].first - k.first != q[i].second - k.second && /*
        */ q[i].first - k.first != k.second - q[i].second)
            result.push_back(q[i]);
    return result;
}
S9
Волшебник
645 / 248 / 38
Регистрация: 18.12.2010
Сообщений: 541
08.06.2012, 16:50     Король и ферзи #5
Цитата Сообщение от qfisher Посмотреть сообщение
да ладно, есть в винде компилятор.) в поставку с NET идет
А с чего вы решили, что у меня винда?
lenalena
39 / 2 / 1
Регистрация: 04.06.2012
Сообщений: 19
08.06.2012, 16:59  [ТС]     Король и ферзи #6
спасибо большое)

Добавлено через 3 минуты
S9 если будет возможность, набросай вечерком, буду очень благодарна))
S9
Волшебник
645 / 248 / 38
Регистрация: 18.12.2010
Сообщений: 541
08.06.2012, 17:04     Король и ферзи #7
Цитата Сообщение от lenalena Посмотреть сообщение
S9 если будет возможность, набросай вечерком, буду очень благодарна))
Если будет время - набросаю. Просто экзамен завтра у меня в 9 утра((
lenalena
39 / 2 / 1
Регистрация: 04.06.2012
Сообщений: 19
08.06.2012, 17:13  [ТС]     Король и ферзи #8
Удачи на экзамене)) мне просто к след. пятнице нужно сдать 5 задач. одну уже сдала. над второй думаю. вот еще 3 нужно, а я не понимаю как делать. Если сдам 5 задач, то экзамен автоматом поставят))
S9
Волшебник
645 / 248 / 38
Регистрация: 18.12.2010
Сообщений: 541
08.06.2012, 17:17     Король и ферзи #9
Завтра после экзамена (это часов в 11-12) смогу тебе помочь. Напиши в личку или ещё куда нибудь
lenalena
39 / 2 / 1
Регистрация: 04.06.2012
Сообщений: 19
09.06.2012, 15:04  [ТС]     Король и ферзи #10
Хорошо)) спасибо))

Добавлено через 21 час 27 минут
S9, Привет, помоги пожалуйста с задачкой)) Король и ферзи

Добавлено через 18 минут
ой, хотела в личку отправить, а получилось сюда)
S9
Волшебник
645 / 248 / 38
Регистрация: 18.12.2010
Сообщений: 541
10.06.2012, 14:00     Король и ферзи #11
lenalena, извини, что так долго. Просто после экзамена отрубился и почти сутки проспал(((

вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/** На шахматной доске находятся король и несколько ферзей другого цвета. 
Проверить находится ли король под угрозой и если да, кто ему угрожает. 
Положение фигур задано массивом К(8,8). 0-клетка пуста, 1-король, 2-ферзь. 
Ферзь бьет по горизонтали, вертикали и диагоналям. */
 
#include <iostream>
#include <fstream>
#include <vector>
 
#define IN_DATA_FILE_NAME "in.txt"
#define SIZE_M 8
#define SIZE_N 8
 
int main(int argc, char ** argv)
{
  int king_i, king_j; /** это координаты короля */
  std::vector< std::pair<int, int> > queen; /** создаем вектор из пар, для хранения координат ферзей */
  bool killKing = false; /** есть короля можно выпилить, то TRUE, если нельзя - то FALSE */
  
  int **K = new int * [SIZE_M]; /** этот массив - есть поле, где стоят фигуры */
  for(int i = 0; i < SIZE_N; i++) /** выделяем память под массив */
    K[i] = new int[SIZE_N];
  
  std::ifstream in(IN_DATA_FILE_NAME);
  
  for(int i = 0; i < SIZE_M; i++, std::cout << std::endl) /** Записываем массив из файла */
    for(int j = 0; j < SIZE_N; j++)
    {
      in >> K[i][j];
      std::cout << K[i][j] << " ";
      switch (K[i][j])
      {
        case 1 : { king_i = i; king_j = j; }; break; /** записываем координаты короля */
        case 2 : { queen.push_back(std::pair<int, int>(i, j)); }; break; /** записываем координаты ферзя в queen */
      }
    }  
  in.close(); /** т.к. файл больше нам не нужен, то закрываем его */
  
  /** для наглядности выводим координаты короля и ферзей */
  std::cout << "King -> " << king_i << " : " << king_j << "\n";
  for(int i = 0; i < queen.size(); i++)
    std::cout << "Queen " << i + 1 << " -> " << queen[i].first << " : " << queen[i].second << "\n";
    
  for(int i = 0; i < queen.size(); i++) /** теперь перебираем массив ферзей и проверям на то, может ли ферзь кокнуть короля */
  if ((king_i == queen[i].first) ||   /** это условие, может ли ферзь минусануть короля */
      (king_j == queen[i].second) || 
      (king_i - king_j == queen[i].first - queen[i].second) || 
      (king_i + king_j == queen[i].first + queen[i].second)) 
  {
    killKing = true; /** если короля можно завалить, то ставим флаг в true */
    break;          /** и выходим из цикла, т.к. это достаточно что один ферзь может убить короля. */
  }
  
  if (killKing)
    std::cout << "Король трупэ!" << std::endl;
  else
    std::cout << "Король будет жить!" << std::endl;
  
  for(int i = 0; i < SIZE_N; i++) /** освбождаем память, выделенную по массив */
    delete [] K[i];
  delete [] K;
  
  return 0;
}
Пример работы на скриншоте
Под Windows компилируется аналогично, только запуск приложение будет не ./a.out а просто а или a.exe

P.S. Только незнаю, почему Вам не воспользоваться кодом Кот Ангенс...
Миниатюры
Король и ферзи  
Вложения
Тип файла: zip S9.zip (7.3 Кб, 6 просмотров)
lenalena
39 / 2 / 1
Регистрация: 04.06.2012
Сообщений: 19
12.06.2012, 01:16  [ТС]     Король и ферзи #12
Спасибо большое))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2013, 19:28     Король и ферзи
Еще ссылки по теме:

Мирные ферзи - PHP
На шахматной доске, нужно расставлять 8 ферзей чтоб никто, никого не бил.

Задача «Ферзи» - Python
Условие Известно, что на доске 8×8 можно расставить 8 ферзей так, чтобы они не били друг друга. Вам дана расстановка 8 ферзей на доске,...

prolog задача про ферзи - Prolog
С помощью предиката uazirler (queens) 2-х аргументов, найдите все правильные расстановки ферзей на шахматной доске размером , в которых...

Определить, бьют ли ферзи друг друга - Turbo Pascal
На шахматной доске стоят два ферзя. Определить, бьют ли они друг друга. Местоположение задается 4 числами, определяющими их координаты....

Определить, угрожают ли ферзи друг другу - Pascal
На шахматной доске стоят белый и черный ферзи (ферзь бьет по вертикали, горизонтали и диагонали). Их координаты заданы парами чисел (х1,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Alex R
Сообщений: n/a
24.06.2013, 19:28     Король и ферзи #13
@lenalena, есть решение этой задачи?
тоже самое надо срочно

Добавлено через 2 минуты
виноват, не заметил второй страницы темы
Yandex
Объявления
24.06.2013, 19:28     Король и ферзи
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru