我正在解决 N Queen 问题,我们需要在 4 X 4 棋盘上放置 4 个皇后,这样没有两个皇后可以互相攻击。我早些时候尝试过,但我的方法不涉及回溯,所以我再次尝试。代码片段是
int size=4,i,j;
int arr[4][4];
int lastjindex[4]; // to store the last location which we may need to backtrack
void placeQueen(int i,int j)
{
int availableornot=0;
for(j=0;j<size;j++)
{
if(isAvailable(i,j)==1)
{
availableornot=1;
break;
}
}
if(availableornot==1)
{
arr[i][j]=1;
lastjindex[i]=j;
if((i+1)!=size)
{
placeQueen(i+1,0);
}
}
else
{
// no column was availabe so we backtrack
arr[i-1][lastjindex[i-1]]=0;
placeQueen(i-1,lastjindex[i-1]+1);
}
}
如果 arr[i][j] 没有受到攻击,isAvailable() 方法返回 1,否则返回 0。
int isAvailable(int i,int j)
{
int m,n,flag=0;
for(m=0;m<i;m++)
{
for(n=0;n<size;n++)
{
int k=abs(i-m);
int l=abs(j-n);
if(arr[m][j]==0 || arr[k][l]==0)
{
flag=1;
break;
// means that spot is available
}
}
}
return flag;
}
我从 main 调用上述方法
placeQueen(0,0);
我的程序编译成功,但打印全为零。
我的递归有什么问题吗?请帮助我更正我的代码,因为我正在尝试学习如何实现回溯算法!
我也无法决定结束递归的基本条件。我如何在这里选择它?