Задача о 8 ферзях
Нахождение всевозможных комбинаций расстановки восьми ферзей на пустой шахматной доске, в которой ни один из ферзей не находится под боем другого. Описание базового класса Queens. Визуализация шахматной доски при запуске программы пользователем.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 14.08.2017 |
Размер файла | 188,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
УРАЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ГОРНЫЙ УНИВЕРСИТЕТ
КАФЕДРА ИНФОРМАТИКИ
КУРСОВАЯ РАБОТА
по программированию
Задача о 8 ферзях
Студент: Сорокин С
гр. АСУ-09-1
Преподаватель: доц. Дружинин А.В.
алгоритмический язык: С#
среда разработки: Microsoft Visual Studio 2010
Екатеринбург 2011
Оглавление
1. Постановка задачи
2. Описание базового класса
3. Визуализация
Литература
1. Постановка задачи
комбинация ферзь шахматный пользователь
Нужно расставить восемь ферзей на пустой шахматной доске, в которой ни один из ферзей не находится под боем другого.
2. Описание базового класса
Базовым классом является класс Queens.
class Queens
{
/// <summary>
/// Размер доски.
/// </summary>
public const int BoardSize = 8;
/// <summary>
/// Позиция ферзя на доске.
/// </summary>
private class Pos {
public int row, col;
public bool placed;
public Pos(int r, int c, bool pl)
{
row = r; col = c; placed = pl;
}
};
/// <summary>
/// Состояние клетки доски (Queen - клетка занята ферзём, Empty - пустая клетка).
/// </summary>
private enum PosState { Queen, Empty };
private PosState[,] board = new PosState[BoardSize, BoardSize];
private Stack<Pos> qStack = new Stack<Pos>();
/// <summary>
/// Проверить: находится ли позиция под боем?
/// </summary>
private bool IsPosUnderAttack(Pos p)
{
int i;
for (i = 0; i < p.col; i++)
{
if (board[p.row, i] == PosState.Queen) return true;
if (p.row-i-1 >= 0)
if (board[p.row-i-1, p.col-i-1] == PosState.Queen)
return true;
if (p.row+i+1 < BoardSize)
if (board[p.row+i+1, p.col-i-1] == PosState.Queen)
return true;
//Console.WriteLine("{0}:{1} {2}", p.col-i-1, p.row-i-1, p.row+i+1);
}
return false;
}
/// <summary>
/// Получить свободную (не под боем) позицию в столбце col
/// Возвращается номер строки или -1 - при неудаче
/// Просмотр строк начинаем со строки startRow + 1
/// </summary>
private int GetFreePos(int col, int startRow)
{
for (int r = startRow + 1; r < BoardSize; r++)
if (!IsPosUnderAttack(new Pos(r, col, false)))
return r;
return -1;
}
/// <summary>
/// Получить свободную (не под боем) позицию в столбце col
/// Возвращается номер строки или -1 - при неудаче
/// Просмотр строк начинаем со строки 0.
/// </summary>
int GetFreePos(int col)
{
return GetFreePos(col, -1);
}
/// <summary>
/// Инициализация объекта перед решением задачи.
/// </summary>
public Queens()
{
for(int i=0; i<BoardSize; i++)
for(int j=0; j<BoardSize; j++)
board[i,j] = PosState.Empty;
}
/// <summary>
/// Решить задачу.
/// </summary>
public bool SolveTask()
{
Pos p = new Pos(0, 0, true);
qStack.Push(p);
board[0, 0] = PosState.Queen;
while(qStack.Count > 0) {
p = qStack.Peek();
if (p.placed) { // Предыдущий ферзь установлен - ставим следующий
if (p.col < BoardSize-1) { // Справа от этого ферзя можно попытаться поставить ещё.
int r = GetFreePos(p.col+1);
if (r > -1) { // Ставим нового ферзя справа от старого (есть позиция, которая не под боем).
qStack.Push(new Pos(r, p.col+1, true));
board[r, p.col+1] = PosState.Queen;
}
else { // Нового ферзя поставить нельзя - производим откат назад
qStack.Peek().placed = false; // Из-за этого Pos не может быть структурой
}
}
else { // В последний столбец был поставлен ферзь - задача решена.
return true;
}
}
else { // Корректируем позицию ферзя на котором произошел возврат (если возможно)
while(true) {
if (qStack.Count == 0) return false;
board[qStack.Peek().row, qStack.Peek().col] = PosState.Empty;
int r = GetFreePos(qStack.Peek().col, qStack.Peek().row);
if (r > -1) { // Корректируем позицию ферзя на котором произошел возврат
qStack.Peek().row = r;
qStack.Peek().placed = true;
board[qStack.Peek().row, qStack.Peek().col] = PosState.Queen;
break;
}
else { // Удаляем последнего ферзя (откорректировать позицию не удалось)
qStack.Pop();
}
}
}
}
return false;
}
/// <summary>
///.
/// </summary>
}
}
3.Визуализация
При запуске программы пользователь видит шахматную доску, на которую при нажатии кнопки «расставить» происходит расстановка ферзей (одна из 92 возможных комбинаций)
Выход - кнопка “Выход”
Литература
1. Рекурсия, вероятностные алгоритмы. Макконелл Дж.
2. Основы современных алгоритмов. М., Техносфера, 2004 , Корнилов Е.
3. Программирование шахмат и других логических игр. СПб., БХВ-Петербург, 2005
4. http://msdn.microsoft.com/ru-ru/vcsharp/
Размещено на Allbest.ru
Подобные документы
Методика и основные этапы разработки программы, которая бы наглядно продемонстрировала варианты размещения ферзей на шахматной доске, удовлетворяя правилам задачи. Исследование свойств расстановок мирных ферзей. Написание текста программы и ее листинг.
контрольная работа [81,1 K], добавлен 29.04.2011Задача о восьми ферзях как широко известная задача по расстановке фигур на шахматной доске. Характеристика алгоритмов решения задачи для доски 8х8. Рассмотрение особенностей программы, использующей алгоритм Лас-Вегаса, проведения статистического анализа.
контрольная работа [382,3 K], добавлен 06.08.2013Разработка программы в среде Pascal ABC.NET, которая обеспечит расстановку ферзей таким образом, что будут пробиваться все свободные позиции. Составление листинга реализации программы. Тестирование разработанного продукта и устранение его погрешностей.
контрольная работа [19,2 K], добавлен 09.12.2013Разработка программы для оценки шахматной ситуации на доске с использованием графического интерфейса. Способы вывода результатов. Библиотека визуальных компонентов. Модульная структура приложения, его внешний вид. Последовательность работы с приложением.
контрольная работа [132,2 K], добавлен 07.10.2010Разработка программы в среде Delphi, показывающей на экране возможные варианты выбранной шахматной фигуры для хода. Спецификация исходных данных и функций программы, тексты разработанных классов приложения и их ключевые методы, тестирование программы.
курсовая работа [69,4 K], добавлен 19.10.2010Определение понятия алгоритмов, принципы их решения людьми и всевозможными техническими устройствами. Применение компьютера для решения задач. Особенности использования метода последовательного укрупнения при создании шахматной доски по алгоритму.
презентация [1,1 M], добавлен 06.02.2012Создание программы движения коня по шахматной доске, ее функциональное и эксплуатационное назначение, требования пользователя к программному изделию. Виды скриншотов, информационная совместимость, программные ограничения и требования к документации.
курсовая работа [1,4 M], добавлен 17.02.2010Разработка программы нахождения оптимального пути обхода шахматной доски шахматным конем с обязательной визуализацией процесса и пошаговой демонстрацией. Тестирование графического интерфейса. Исходный код программы, составление и проверка алгоритма.
курсовая работа [468,3 K], добавлен 11.12.2012Анализ правил выбора хода на шахматной доске К. Шеннона. Характеристика программного модуля искусственного интеллекта для игры в шахматы. Контроль времени, поиск лучшего хода в шахматных алгоритмах. Разработка программы для игры с компьютерным оппонентом.
дипломная работа [3,7 M], добавлен 07.07.2012Методика проектирования программы, основной функцией которой является нахождение формулы производной на основании введенной пользователем исходной формулы, представляющей собой суперпозицию элементарных функций. Структура и возможности программы.
контрольная работа [106,3 K], добавлен 23.08.2009