我有这段代码:
for (int i=0; i<N; i++)
{
int j;
if (i%2==1) j=1;
else j=0;
for (; j<N; j+=2)
{
for(int k=0; k<N; k++)
{
int n;
if (k%2==1) n=1;
else n=0;
for (; n<N; n+=2)
{
for (int l=0; l<N; l++)
{
int o;
if (l%2==1) o=1;
else o=0;
for (; o<N; o+=2)
{
for(int m=0; m<N; m++)
{
int p;
if (m%2==1) p=1;
else p=0;
for (; p<N; p+=2)
{
if (check_full(lenta,i,j,k,n,l,o,m,p))
{
count++;
cout<<"Lenta uzsipilde: ("<<i<<","<<j<<"), "<<"("<<k<<","<<n<<"), "<<"("<<l<<","<<o<<"), "<<"("<<m<<","<<p<<"), "<<endl;
}
}
}
}
}
}
}
}
}
有什么办法可以变成递归吗?基本上这些循环找到给定问题的所有可能坐标。如果它可以转换成一个小的递归,我需要使用数组而不是8个变量吗?
这是我试图做的,但它不起作用:
void findBishops(){
for (int i=0; i<N; i++){
int j;
if (i%2==1) j=1;
for (; j<N; j+=2){
putIntoArray(array, i, j);
if (isFull(board, array)){
PrintAnswer(array);
}else{
arrayCount = arrayCount-2;
findBishops();
}
}
}
}
void putIntoArray(array[], i, j){
array[arrayCount++] = i;
array[arrayCount++] = j;
}
答案 0 :(得分:0)
我可能会对主教进行审判而不是在董事会上进行循环:
首先放置一位主教,然后递归放置第二位,依此类推,直到你到达最后一位 当您从递归返回时发生回溯,当您尝试下一个替代方案时,为单个主教,然后再次递归。 直到你用完了选项 - 就在你完成的时候。
这是一个粗略的概述:
place_bishop(this_bishop)
if this_bishop is the final bishop:
for every possible position of this_bishop:
see if it's a solution and handle that
else:
for every possible position of this_bishop:
place_bishop(next_bishop)
选择位置需要一些思考,以便不会多次找到同一个解决方案。