Как продолжить в этом алгоритме 8 королевы?

Код и вывод работают нормально до возврата, но я не могу приступить к возврату. Что делать после расстановки? Это дает вывод первых 4 ферзей только средства перед возвратом.

    #include <iostream>
#include <conio.h>
using namespace std;
int recu(int i,int k);
void place(int i,int k);
void unplace(int i,int k);
int q[8][8];
int row[8];
int column[8];
int c[15];
int d[15];
int totalqueens=0;
int s;

int main()
{
for(int i=0;i<8;i++) //Flags for rows,columns and diagonals
{
row[i]=0;
column[i]=0;
c[i]=0;d[i]=0;
}
for(int i=8;i<15;i++)
{
c[i]=0;d[i]=0;
}
int i=0;
int k=0;
recu(i,k);for(int i=0;i<8;i++)
{
for(int k=0;k<8;k++)
{
if(q[i][k]==1)
{
cout<<"(";
cout<<i;
cout<<",";
cout<<k;
cout<<")";
}
}
}

getch();
return 0;
}

int recu(int i,int k)
{
if(totalqueens==8)
{  goto print; }
if(k<8)
{
if(column[i]==0 && row[k]==0 && c[i+k]==0 && d[i-k+7]==0)
{
place(i,k);

s=k;
k=0;
recu(i+1,k);
}
else
{
recu(i,k+1);
unplace(i-1,s);
//**I am not able to proceed further**
}

}

print:
;
}

void place(int i,int k)
{
totalqueens++;
q[i][k]=1;
row[k]=1;
column[i]=1;
c[i+k]=1;
d[i-k+7]=1;
}

void unplace(int i,int k)
{
q[i][k]=0;
row[i]=0;
column[k]=0;
c[i+k]=0;
d[i-k+7]=0;
//cout<<"before call";
recu(i,k+1);
//cout<<"working";
}

-1

Решение

Ваш код выдает только одно решение.
Вы не поместите выходную часть в нужное место.

попробуй так:

void print()
{
for(int i=0;i<8;i++)
{
for(int k=0;k<8;k++)
{
if(q[i][k]==1)
{
cout<<"(";
cout<<i;
cout<<",";
cout<<k;
cout<<")";
}
}
}
}

сделать это одним из методов. и затем, в вашем методе recu, измените на:

if(totalqueens==8)
{
print();
return;
}

Имейте в виду, что НЕ используйте предложение goto. Это очень некрасиво и может вызвать неизвестные проблемы.

0

Другие решения

Вы возвращаетесь, когда не все королевы были помещены, и вы не можете разместить другую королеву. Вы возвращаетесь следующим образом:

  1. Посмотрите, может ли последняя королева быть размещена в более позднем месте. Если так, поместите это там и прекратите возвращаться. (Возобновить размещение.)

  2. Удалить последнюю помещенную королеву.

  3. Если королев больше не осталось, остановитесь. Все решения были найдены.

  4. Переходите к шагу 1.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector