Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 24
На сайте нет зарегистрированных пользователей

Пользователей: 13,361
новичок: uehuat
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование системы управления качеством производственного процесса на...
Моделирование регулировочного участка цеха на GPSS + Пояснительная записка
Моделирование работы обрабатывающего участка цеха в GPSS

Задача о восьми ферзях
Задание:
Реализовать решение «задачи о восьми ферзях»: расставить на шахматной доске размером N×N клеток N ферзей так, чтобы ни один из них не находился под боем другого.

1.ОПИСАНИЕ ПРОГРАММЫ
1.1. Функциональное назначение

Программа предназначена для решения задачи о расстановке ферзей на шахматном поле. Программа представляет собой консольное приложение . Пользователь имеет возможность получит все варианты расстановок N ферзей для поля N × N.

1.2. Описание логической структуры

При решении поставленной задачи был применен алгоритм перебора с возвратами (backtracking).
Метод перебора с возвратами позволяет решать практически бесчисленное множество задач, для многих из которых не известны другие алгоритмы. Несмотря на такое большое многообразие переборных задач, в основе их решения есть нечто общее, позволяющее применить данный метод. Таким образом перебор можно считать практически универсальным методом переборных решения задач. Решение задачи методом перебора с возвратом строится конструктивно последовательным расширением частичного решения. Если на конкретном шаге такое расширение провести не удается, то происходит возврат к более короткому частичному решению, и попытки его расширить продолжаются.

Рассмотрим подробнее алгоритм перебора с возвратом на примере задачи о восьми ферзях:
1. Поскольку ферзи «бьют» друг друга по вертикали (то есть на каждой вертикали их не более одного), то шаг рекурсии может состоять выставлении ферзя на очередную вертикаль. Инвариант процесса – первые i ферзей уже корректно выставлены, шаг добавляет еще одного ферзя, сохраняя корректность. Формальный параметр шага – номер вертикали (i), фактический параметр рекурсивного вызова – номер следующей вертикали (i+1). Алгоритм ищет первую подходящую расстановку и возвращает логическое значение – расстановка найдена (1) или не найдена (0). Общие данные представляют собой доску с уже выставленными ферзями: для этого достаточно иметь одномерный массив, индекс в котором обозначает позицию ферзя по вертикали, а значение – позицию по горизонтали.

2. Перебор вариантов заключается в последовательном выставлении очередного ферзя на все N клеток вертикали. Если после выставления он находится под боем, клетка пропускается. Если нет, то производится попытка выставить следующего за ним и т.д. до конца путем вызова рекурсивной функции. Схема поиск первого подходящего говорит о том, что при положительном результате рекурсивного вызова (цепочка достроена до конца), необходимо прервать цикл поиска и возвратить этот вариант «наверх также и от себя». В противном случае – перебор продолжается. По окончании просмотра – возвратить 0.

3. Поскольку каждый ферзь «выставляется» в глобальном массиве, то по завершении цепочки «успешных» выходов из рекурсивных вызовов в нем и будет находиться первый подходящий вариант. Ферзи считаются успешно выставленными, если рекурсивная функция достигает несуществующей вертикали. Эта проверка должны быть сделана в самом начале тела функции.


Логическая структура программного продукта представляет собой связь и взаимодействие отдельных составных частей (модулей) друг с другом, обеспечивающих его согласованную работу и совместное функционирование приложения в целом.

- queens.h- заголовочный файл, содержащий прототипы функций
- main.cpp- главный модуль.

Файл main.cpp содержит следующие функции:

char check(int*A, int n)

{

int i,j;

for (i=0; i<n; i++)

for (j=0; j<n; j++)

{

if ((A[i]==A[j])&&(i!=j)&&(A[i]!=0)&&(A[j]!=0))return 0;

if (((A[i]+i)==(A[j]+j))&&(i!=j)&&(A[i]!=0)&&(A[j]!=0)) return 0;

if (((A[i]-i)==(A[j]-j))&&(i!=j)&&(A[i]!=0)&&(A[j]!=0)) return 0;

}

return 1;

}







В этой функции реализуется проверка нахождения i-го ферзя со всеми предыдущими ферзями на одной горизонтали и диагонали. В случае, если ферзь находится « под боем» возвращает 0, если нет, то возвращаемое значение равно 1.

void print_queen(int*A, int n)

{

fout<<"solutions:"<<(z+1)<<endl;

int i,j;

for (i=0; i<n; i++)

{

for (j=0; j<n; j++) fout<<"--"; fout<<"-\n";

for (j=1; j<A[i]; j++) fout<<"| ";

fout<<"|f";

for (j=A[i]; j<n; j++) fout<<"| ";

fout<<"|\n";

}

for (j=0; j<n; j++) fout<<"--"; fout<<"-\n\n";

z=z+1;

}






Функция отвечает за вывод на экран (файл) «шахматной доски» с расставленными ней ферзями, в соответствии с найденным решением. Осуществляет также подсчет количества вариантов решения.

void build(int*A, int n)



{

int*B;

int i,k;

for (k=0;(A[k]!=0)&&(k<n);k++);

if (k>=n){print_queen(A,n); return;}

B=(int*)malloc(n*sizeof(int));

for (i=0;i<k;i++) B[i]=A[i];

for (i=k;i<n;i++) B[i]=0;



for (i=1;i<=n;i++)

{

B[k]=i;

if (check(B,n)) build(B,n);

}



free(B);

}






Функция осуществляет инициализацию и выделение памяти под новый массив, хранящий состояние «шахматной доски» для рассматриваемой постановки ферзя. Осуществляет вызов функции check() для проверки условия.
После того, как все горизонтали пройдены вызывается функция print_queen().

int main()

{

int i,n;

int*A;

ifstream fin("input.txt");

ofstream fout("output.txt");

fin>>n;

A=(int*)malloc(n*sizeof(int));



for (i=0;i<n;i++)A[i]=0;

build(A,n);



fout<<"Variants:\n"<<z<<endl;

free(A);

return 0;

getch();

}






Главная функция. Осуществляет считывание из файла числа N, затем осуществляется инициализацию и выделение памяти под массив, хранящий состояние «шахматной доски» с поставленными ферзями. Осуществляет вызов функции build().А также печать в файл общего числа решений.

1.3. Вызов и загрузка

Для работы программы необходимо запустить исполняемый файл «queen.exe»,предварительно убедившись в существованиии файла input.txt с указанием входных данных, если же такового файла не существует, то создать его.

1.4. Входные данные
Входными данными является число N,где N-количество выстраиваемых ферзей, а также размерность шахматной доски. Входные данные представлены в текстовом файле «input.txt».

1.5. Выходные данные
Выходными данными являются возможные варианты расстановки ферзей на шахматной доске, сохраненные в текстовый файл output.txt

Листинг программы

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <fstream>

#include "queens.h"



using namespace std;



ifstream fin("input.txt");

ofstream fout("output.txt");

int z=0;



char check(int*A, int n)

{

int i,j;

for (i=0; i<n; i++)

for (j=0; j<n; j++)

{

if ((A[i]==A[j])&&(i!=j)&&(A[i]!=0)&&(A[j]!=0))return 0;

if (((A[i]+i)==(A[j]+j))&&(i!=j)&&(A[i]!=0)&&(A[j]!=0)) return 0;

if (((A[i]-i)==(A[j]-j))&&(i!=j)&&(A[i]!=0)&&(A[j]!=0)) return 0;

}

return 1;

}



//---------------------------------------------------------------------------



void print_queen(int*A, int n)

{

fout<<"solutions:"<<(z+1)<<endl;

int i,j;

for (i=0; i<n; i++)

{

for (j=0; j<n; j++) fout<<"--"; fout<<"-\n";

for (j=1; j<A[i]; j++) fout<<"| ";

fout<<"|f";

for (j=A[i]; j<n; j++) fout<<"| ";

fout<<"|\n";

}

for (j=0; j<n; j++) fout<<"--"; fout<<"-\n\n";

z=z+1;

}



//---------------------------------------------------------------------------



void build(int*A, int n)

{

int*B;

int i,k;

for (k=0;(A[k]!=0)&&(k<n);k++);

if (k>=n){print_queen(A,n); return;}

B=(int*)malloc(n*sizeof(int));

for (i=0;i<k;i++) B[i]=A[i];

for (i=k;i<n;i++) B[i]=0;



for (i=1;i<=n;i++)

{

B[k]=i;

if (check(B,n)) build(B,n);

}



free(B);



}



//--------------------------------------------------------------------------------



int main()

{



int i,n;

int*A;

fin>>n;

A=(int*)malloc(n*sizeof(int));



for (i=0;i<n;i++)A[i]=0;

build(A,n);

fout<<"Variants:\n"<<z<<endl;

free(A);

return 0;

getch();

}





Опубликовал Kest May 12 2011 08:34:49 · 5 Комментариев · 22259 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
jeka May 28 2011 13:26:49
а скажите пожалуйста как создать файл queens.h который требуется при компиляции,изивините за такой нубский вопрос но всеже)
noname June 26 2012 00:10:10
2 jeka :
его нужно добавить в VS в проект заголовочные файлы и туда скопировать прототипы функций
Noname December 06 2013 11:34:50
все невернооооо!!!!!smileysmileysmileysmileysmileysmileysmileysmiley
L May 09 2014 16:30:40
Объясните подробнее, как работает функция build
fish72 January 06 2022 10:50:43
Откомпиллированная быстрая программа «QueensProblem.exe»
https://disk.yandex.ru/d/ZSKQmtIFtVhatw
расставляет максимальное количество ферзей на квадратной
клетчатой таблице (размер таблицы от 4 до 23) так, чтобы
они не били друг друга.
Программа очень проста в управлении (нет меню).
Текстовый поясняющий файл приложен. Для маленьких
таблиц (размер<=18) результат даётся в графическом
виде. Для больших таблиц (размер>18) поиск
расположений ферзей рекомендуется разбить на несколько
частей, причём можно одновременно искать в разных
частях, если процессор позволяет.
1) Имеются очень много сайтов и статей, посвящённых
этой задаче. Но не приведены откомпиллированные
вычисляющие программы
2) Результаты вычислений сохраняются даже при
экстренном выключении компьютера.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Алгоритм трассиро...
PCX
ИНТЕРНЕТ ПРОГРАММ...
Run
Фильтры изображений
PDA версия сайта
PHP: Полезные приемы
Реализация ЭЦП по...
Создание оригинал...
Delphi 2005. Разр...
Пример работы с б...
Сложный калькулятор
Halcyon
Battle.Net - мони...
Форма в форме
CoolDev TipsSyste...
Averaging [Исходн...
index.php + мод ...
Swat [Исходник на...
Delphix Sample [И...

Топ загрузок
Приложение Клие... 100772
Delphi 7 Enterp... 97809
Converter AMR<-... 20260
GPSS World Stud... 17014
Borland C++Buil... 14189
Borland Delphi ... 10267
Turbo Pascal fo... 7372
Калькулятор [Ис... 5972
Visual Studio 2... 5206
Microsoft SQL S... 3661
Случайные статьи
Порядок в базе данных
Отключение шифрова...
Выбирайте правильн...
Программа TidyGUI
Доставка грузов
Технологии Gigabit...
Что позволяет сдел...
Эталонная модель п...
Перегрузка шаблоно...
Выдача команд на у...
Методы класса
Официальный сайт к...
Карта START
League for Program...
Функция проверяюща...
Формы представлени...
стр. 445 Ответы на...
Планирование разве...
Unit name mismatch
Microsoft проявляе...
Современное состоя...
Работа с Веб-серви...
5.2.1. Вывод литер
Содержание
О рекламе и о спаме
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?