Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.07.2012, 21:02   #1
kostolomeo
Пользователь
 
Регистрация: 26.04.2012
Сообщений: 11
По умолчанию Рекурсия

Здравствуйте. Мне нужно написать программу, которая с помощью рекурсии находит все 92 варианта растановки ферзей (так чтобы ни одна ферзя не оказалась под боем другой) на доске 8х8. Пока что я понял как можно реализовать эту задачу с помощью цикла, а вот как это сделать рекурсией - никак не разберу. Подскажите или покажите на примере, как эту же задачу сделать с помощью рекурсии. Вот пример программы в виде цикла с некоторыми набросками меню:

Код:
#include <vcl.h>
#include "Unit1.h"
 
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 

__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner){
}
 
int up[15], down[15], rows[8], x[8];
 
bool IsBlack(int i, int j)
{
 if (j%2==0)
   if (i%2==1) return true;
    else return false;
 else
   if (i%2==0) return true;
   else return false;
}
 
void VisualChess()
{
  Form1->DrawGrid1->Repaint();
  for (int i=0;i<=7;i++)
    for (int j=0;j<=7;j++)
      if (IsBlack(i, j)) {
        Form1->DrawGrid1->Canvas->Brush->Color = clBlack;
        Form1->DrawGrid1->Canvas->FillRect(Form1->DrawGrid1->CellRect(i, j));
      }
  AnsiString s=Form1->ListBox1->Items->Strings[Form1->ListBox1->ItemIndex];
  for (int i = 0;i <= 7; i++) {
    int j = StrToInt(s[i+1])-1;
    Form1->DrawGrid1->Canvas->Brush->Color = clRed;
    Form1->DrawGrid1->Canvas->FillRect(Form1->DrawGrid1->CellRect(i, j));
  }
}
 
void Choice(int c)
{
  for (int r = 0; r < 8; r++)
    if (rows[r] && up[r-c+7] && down[r+c])
    {
       rows[r] = up[r-c+7] = down[r+c] = 0;
       x[c] = r;
       if (c == 7)
       {
         AnsiString s="";
         for (int k = 0; k < 8; k++) s=s+IntToStr(x[k]+1);
         Form1->ListBox1->Items->Add(s);
       }
       else Choice(c + 1);
       rows[r] = up[r-c+7] = down[r+c] = 1;
    }
}
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Button1->Enabled=false;
  for (int i = 0; i < 15; i++) up[i] = down[i] = 1;
  for (int i = 0; i < 8; i++)  rows[i] = 1;
  Choice(0);
  ListBox1->ItemIndex=ListBox1->ItemIndex+1;
  VisualChess();
}
 
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
 VisualChess();
}
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  TGridRect R;
  R.Top = -1;
  R.Bottom = -1;
  R.Left = -1;
  R.Right = -1;
  DrawGrid1->Selection = R;
}
void __fastcall TForm1::ExitClick(TObject *Sender)
{
Form1->Close();
}


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 25.07.2012 в 00:59.
kostolomeo вне форума Ответить с цитированием
Старый 25.07.2012, 13:17   #2
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Тыц
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
рекурсия cherry097 Помощь студентам 1 02.04.2011 14:44
Рекурсия dusya9992 Паскаль, Turbo Pascal, PascalABC.NET 4 29.08.2010 14:14
рекурсия Lena neznayka Помощь студентам 2 16.06.2010 20:46
Рекурсия Solnze2 Паскаль, Turbo Pascal, PascalABC.NET 0 09.06.2010 09:28
рекурсия -Spirit- Помощь студентам 1 14.01.2010 16:40