Для определения возможности поставить текущего ферзя мы проверяем в цикле в координатной форме не находится ли он на одной из диагоналей («главной» и «побочной») или строке с каждым из ферзей поставленных ранее.
В качестве вывода результата используется 2 способа:
1. Формирование и отображение html страницы с результатами. Этот способ требует прав создания и изменения файлов в каталоге, где она находится. Но он более красивый чем второй, тем более что он отображается в стандартном браузере Internet Explorer, в котором результаты можно распечатать сохранить куда необходимо и др.
2. Вывод результатов в консоль программы. Этот способ используется если создать html файл не удалось. Он менее нагляден, и удобен, но работает всегда.
Для реализации первого способа используется процедура print_htm(), а для реализации второй – print_console()
Используется также переменная count для хранения текущего количества найденных результатов.
Процедуры init() и close() используются для подготовки к работе основного кода программы и для корректного ее завершения соответственно.
Для начала работы с программой надо запустить фаил 8Q.exe после чего запуститься программа. Если программе удалось создать htm файл, то она записывает варианты решения в него и запускает Интернет браузер Internet Explorer с открытой страницей, сгенерированной программой и содержащей результат работы, либо если файл создать не удалось, то выведет в консоль ошибку и результаты работы будут выводиться непосредственно в консоль. После вывода очередного результата пользователю будет предложено нажать любую кнопку для продолжения работы программы и вывода следующего результата. Когда все результаты будут выведены на экран, программа сообщит об этом и после нажатия на любую кнопку завершится.
программа размещение ферзь шахматный
Текстпрограммы
#include <iostream>
#include <conio.h>
#include <iomanip>
#include <windows.h>
using namespace std;
FILE *result;
int opened;
int queens[8], count;
void print_console()
{
cout <<»–=============–\n»;
cout <<» Version #» <<count << «\n»;
cout <<» –===========–\n»;
cout <<» a b c d e f g h \n»;
for (int i=0; i<8; i++)
{
cout <<» +-+-+-+-+-+-+-+-+ \n»;
cout <<» " <<8-i;
for (int j=0; j<8; j++)
{
if (j!=queens[i]) cout << "|»; else cout << "|W»;
}
cout << "|» <<8-i <<»\n»;
}
cout <<» +-+-+-+-+-+-+-+-+ \n»;
cout <<» a b c d e f g h \n\n Press any key to continue…\n»;
getch();
count++;
}
void print_htm()
{
if (count % 2) fprintf (result, «<tr><td align=\ «center\">\n»); else fprintf (result, «<td align=\ «center\">\n»);
fprintf (result, «<table border=\ «0\» width=\ «100%\» cellspacing=\ «0\» cellpadding=\ «0\">\n»);
for (int i=0; i<8; i++)
{
fprintf (result, «<tr>\n»);
for (int j=0; j<8; j++)
{
if (! ((i+j)%2)) fprintf (result, «<td bgcolor=\ «#FFFFFF\»>»); else fprintf (result, «<td bgcolor=\ «#999999\»>»);
if (j!=queens[i]) fprintf (result, « »); else fprintf (result, «<font size=\ «6\» style=\ «bold\">W</font>»);
fprintf (result, «</td>\n»);
}
fprintf (result, «</tr>\n»);
}
fprintf (result, «<tr><td align=\ «center\» colspan=\ «8\"><font size=\ «4\» style=\ «bold\»>Вариант №%d</font></td></tr>\n», count);
fprintf (result, «</table><br><br>\n»);
if (count % 2) fprintf (result, «</td>»); else fprintf (result, «</td></tr>»);
count++;
}
int put_queen (int x)
{
if (x==8)
{
if (opened) print_htm(); else print_console();
return 0;
}
for (int y=0; y<8; y++)
{
int can_put=1;
for (int q=0; q<x; q++)
{
if (((queens[q] – y)==(q-x)) || (queens[q]==y) || ((queens[q]+q)==(x+y))) can_put=0;
}
if (can_put)
{
queens[x]=y;
put_queen (x+1);
}
}
return 0;
}
void init()
{
if (! (result = fopen («queens.htm», «w»)))
{
printf («Error creating result file. Result will be displayed in console.\n»);
opened=0;
} else opened=1;
if (opened) fprintf (result, «\
<html>\n\
<head>\n\
<title>Курсовая работа по програмированию</title>\n\
<meta http-equiv='content-type' content='text/html; charset=windows-1251' />\n\
</head>\n\
<body bgcolor=\ «#FFFFFF\»>\n\
<p><h2>Задача:</h2><br/>\n\
Какими способами можно расставить на доске восемь ферзей так, чтобы они не угрожали друг другу, т.е. никакие два не стояли на одной вертикали, горизонтали и диагонали?</p>\
<br><h2>Решения (всего 92):</h2><br>\n\
<table border=\ «0\» width=\ «100%%\» cellspacing=\ «0\» cellpadding=\ «0\">\n»);
}
void close()
{
if (! opened)
{
cout << «That's all. Enjoy…»;
getch();
} else
{
fprintf_s (result, «</table> *Эта страница была сгенерирована курсовой программой студента гр. КИ-06–7 Парченко П.В.»);
WinExec («explorer \ «queens.htm\"», SW_SHOW);
fclose(result);
}
}
int main()
{
init();
count=1;
put_queen(0);
close();
return 0;
}