Я пытаюсь вырваться из нескольких вложенных циклов, и у меня возникли проблемы. Я хочу, чтобы эта программа вырвалась во внешний цикл, который будет выполняться только определенное количество раз. Я пытался сделать это с логическим значением, но моя программа завершается слишком рано. Это проблема N-Queens, где я решаю задачи для 1×1, 2×2, 3×3, … nxn queens.
Вот мой код:
bool ok(int *q, int col)
{
for(int i=0; i<col; i++)
if(q[col]==q[i] || (col-i)==abs(q[col]-q[i])) return false;
return true;
};
void print(int q[], int n, int cnt)
{
//static int count =0;
cout<<"There are "<<cnt<<" solutions for "<<n<<" queens." <<endl;
};
int main()
{
int n;
int *q;
cout<<"Please enter the size of the board:"<<endl;
cin>>n;
int static count = 0;
int c = 1;
int a = 1;
bool from_backtrack=false;
while(a!=n){
q= new int[a];
q[0]=0;
bool foundSolution=true;
while(foundSolution)
{
if (c==a){
a++;
}
while(c<a)
{
if(!from_backtrack)
q[c] = -1; //Start at the top
from_backtrack=false;
while(q[c]<a)
{
q[c]++;
if (q[c]==a)
{
c--;
if(c==-1) {
print(q, n, count);
foundSolution=false;
//system("PAUSE"); exit(1);
}
continue;
}
if( ok(q,c) ) break; //get out of the closest while loop
}
c++;
}
count++;
c--;
if(c==-1) {
print(q, n, count);
foundSolution=false;
//system("PAUSE"); exit(1);
}
from_backtrack=true;
}
delete[a] q;
a++;
}
system("PAUSE");
}
Самый элегантный способ — обернуть некоторые внутренние циклы в функцию.
Это будет легче читать и контролировать.
В моей работе мы применяем рекомендации MISRA, в которых говорится: «… только 1 разрыв в цикле». Это заставило меня переписать мой if
а также while
петли:
bool can_continue = true;
if (can_continue)
{
status = Do_Something();
if (status != SUCCESS)
{
can_continue = false;
}
}
if (can_continue)
{
status = Do_Another_Thing();
can_continue = status == SUCCESS;
}
//.. and so on.
Идея состоит в том, чтобы установить флаг в «ложь», если выполнение не может продолжаться. Проверьте это после того, как любой сегмент может вызвать сбой выполнения.
while( true ){
if( condition == true ){
goto bye;
}
}
:bye
Только не отправляйте это на домашнюю работу …
Думаю, что это сумасшествие и бесполезность
Однако, предположим, что вам нужно 3 итерации, вы определите массив bool из 3 элементов (все они установлены в true). На каждой итерации вы устанавливаете текущий элемент в false, пока не достигнете конца вашего массива.