Смекни!
smekni.com

Решение задачи о 8 ферзях (стр. 2 из 2)

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

В качестве вывода результата используется 2 способа:

1. Формирование и отображение html страницы с результатами. Этот способ требует прав создания и изменения файлов в каталоге, где она находится. Но он более красивый чем второй, тем более что он отображается в стандартном браузере Internet Explorer, в котором результаты можно распечатать сохранить куда необходимо и др.

2. Вывод результатов в консоль программы. Этот способ используется если создать html файл не удалось. Он менее нагляден, и удобен, но работает всегда.

Для реализации первого способа используется процедура print_htm(), а для реализации второй – print_console()

Используется также переменная count для хранения текущего количества найденных результатов.

Процедуры init() и close() используются для подготовки к работе основного кода программы и для корректного ее завершения соответственно.

Для начала работы с программой надо запустить фаил 8Q.exe после чего запуститься программа. Если программе удалось создать htm файл, то она записывает варианты решения в него и запускает Интернет браузер Internet Explorer с открытой страницей, сгенерированной программой и содержащей результат работы, либо если файл создать не удалось, то выведет в консоль ошибку и результаты работы будут выводиться непосредственно в консоль. После вывода очередного результата пользователю будет предложено нажать любую кнопку для продолжения работы программы и вывода следующего результата. Когда все результаты будут выведены на экран, программа сообщит об этом и после нажатия на любую кнопку завершится.

программа размещение ферзь шахматный

Приложение 1

Текстпрограммы

#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 <<»–=============–&bsol;n»;

cout <<» Version #» <<count << «&bsol;n»;

cout <<» –===========–&bsol;n»;

cout <<» a b c d e f g h &bsol;n»;

for (int i=0; i<8; i++)

{

cout <<» +-+-+-+-+-+-+-+-+ &bsol;n»;

cout <<» " <<8-i;

for (int j=0; j<8; j++)

{

if (j!=queens[i]) cout << "|»; else cout << "|W»;

}

cout << "|» <<8-i <<»&bsol;n»;

}

cout <<» +-+-+-+-+-+-+-+-+ &bsol;n»;

cout <<» a b c d e f g h &bsol;n&bsol;n Press any key to continue…&bsol;n»;

getch();

count++;

}

void print_htm()

{

if (count % 2) fprintf (result, «<tr><td align=&bsol; «center&bsol;">&bsol;n»); else fprintf (result, «<td align=&bsol; «center&bsol;">&bsol;n»);

fprintf (result, «<table border=&bsol; «0&bsol;» width=&bsol; «100%&bsol;» cellspacing=&bsol; «0&bsol;» cellpadding=&bsol; «0&bsol;">&bsol;n»);

for (int i=0; i<8; i++)

{

fprintf (result, «<tr>&bsol;n»);

for (int j=0; j<8; j++)

{

if (! ((i+j)%2)) fprintf (result, «<td bgcolor=&bsol; «#FFFFFF&bsol;»>»); else fprintf (result, «<td bgcolor=&bsol; «#999999&bsol;»>»);

if (j!=queens[i]) fprintf (result, «&nbsp;»); else fprintf (result, «<font size=&bsol; «6&bsol;» style=&bsol; «bold&bsol;">W</font>»);

fprintf (result, «</td>&bsol;n»);

}

fprintf (result, «</tr>&bsol;n»);

}

fprintf (result, «<tr><td align=&bsol; «center&bsol;» colspan=&bsol; «8&bsol;"><font size=&bsol; «4&bsol;» style=&bsol; «bold&bsol;»>Вариант №%d</font></td></tr>&bsol;n», count);

fprintf (result, «</table><br><br>&bsol;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.&bsol;n»);

opened=0;

} else opened=1;

if (opened) fprintf (result, «&bsol;

<html>&bsol;n&bsol;

<head>&bsol;n&bsol;

<title>Курсовая работа по програмированию</title>&bsol;n&bsol;

<meta http-equiv='content-type' content='text/html; charset=windows-1251' />&bsol;n&bsol;

</head>&bsol;n&bsol;

<body bgcolor=&bsol; «#FFFFFF&bsol;»>&bsol;n&bsol;

<p><h2>Задача:</h2><br/>&bsol;n&bsol;

Какими способами можно расставить на доске восемь ферзей так, чтобы они не угрожали друг другу, т.е. никакие два не стояли на одной вертикали, горизонтали и диагонали?</p>&bsol;

<br><h2>Решения (всего 92):</h2><br>&bsol;n&bsol;

<table border=&bsol; «0&bsol;» width=&bsol; «100%%&bsol;» cellspacing=&bsol; «0&bsol;» cellpadding=&bsol; «0&bsol;">&bsol;n»);

}

void close()

{

if (! opened)

{

cout << «That's all. Enjoy…»;

getch();

} else

{

fprintf_s (result, «</table> *Эта страница была сгенерирована курсовой программой студента гр. КИ-06–7 Парченко П.В.»);

WinExec («explorer &bsol; «queens.htm&bsol;"», SW_SHOW);

fclose(result);

}

}

int main()

{

init();

count=1;

put_queen(0);

close();

return 0;

}