Заранее спасибо за ваше время :). Когда я пытался реализовать NQueens, я как бы наблюдал случай, когда ... экземпляр переменных после рекурсии обычно разворачивается в стеке, как в моем случае со всеми переменными, кроме одного двумерного массива. Это не разворачивается ... вместо того, чтобы оставаться таким, каким он был на последнем рекурсивном вызове ... спасибо, что нашли время помочь, спасибо = D.
Место выпуска ... переменная " доска [100] [100] "не разворачивается, вместо этого, как уже было сказано, она остановилась на последнем случае рекурсивного вызова. Я ожидаю, что это будет как 1-я королева, 2-я королева, 3-я королева и 3-я королева, 2-я королева поместил, 1-ая королева помещена точно так же как переменная placed
. Или я думаю, может быть, именно так оно и должно работать, однако я хочу знать логическое объяснение его поведения по поводу того, почему переменная "board" не раскрывается.
void foo(bool board[100][100], int x, int y, int n, int m, int placed)
{
if( placed == n )
{
display(board, n, m);
return ;
}
int i, j;
for(i=x; i<=n; i++)
{
for(j=y; j<=m; j++)
{
if( checkBoard(board, n, m, i, j) )
{
board[i][j] = true;
display(board, n, m);
cout<<placed;
foo(board, 1, 1, n, m, placed+1);
display(board, n, m);
cout<<placed;
}
}
}
}
My Выходные данные -> Как видите, переменная с именем "pped "разворачивается, как и ожидалось, но это не так, как в случае этого двумерного массива с именем" board [100] [100] ".
Весь код: -
#include <bits/stdc++.h>
using namespace std;
int display(bool board[100][100], int n, int m)
{
int i, j;
cout<<"\n===============================================\n\n";
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
if( board[i][j] )
{
cout<<"|Q|";
}
else
{
cout<<"|_|";
}
}
cout<<'\n';
}
cout<<"\n===============================================\n";
}
bool checkBoard(bool board[100][100], int n, int m, int x, int y)
{
int i, j;
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
if( board[i][j] and ( (x==i or y==j) or (abs(x-i)==abs(y-j)) ) )
{
return false;
}
}
}
return true;
}
void foo(bool board[100][100], int x, int y, int n, int m, int placed)
{
if( placed == n )
{
display(board, n, m);
return ;
}
int i, j;
for(i=x; i<=n; i++)
{
for(j=y; j<=m; j++)
{
if( checkBoard(board, n, m, i, j) )
{
board[i][j] = true;
display(board, n, m);
cout<<placed;
foo(board, 1, 1, n, m, placed+1);
display(board, n, m);
cout<<placed;
}
}
}
}
int main(void)
{
int i, j,
n = 4,
m = 4;
bool board[100][100];
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
board[i][j] = false;
}
}
foo(board, 1, 1, n, m, 0);
return 0;
}