M <n using =“”backtracking =“”approach =“”

时间:2015-06-06 10:26:02

标签: algorithm backtracking n-queens

=“”

这是{{3} }。我知道N queens问题及其解决方案,我使用回溯方法用C ++编程语言编写代码:

#include <iostream>

using namespace std;

int col[100];
int n;
int m;

bool check(int i,int k){
    for(int j=1 ; j<k ; j++){
        if(col[j] == i || i-k == col[j] - j || i+k == col[j]+j)return false;
    }
    return true;
}

void queens(int k){
    for(int i=1 ; i<=n ; i++){
        if(check(i,k)){
            col[k] = i;
            if(k == n){
                for(int j=1 ; j<=n ; j++)cout<<col[j]<<" ";
                cout<<endl;
            }
            else queens(k+1);
        }
    }
}

int main(){
    n = 4;
    queens(1);
}

但是,如果我们有 m 皇后而不是 n 哪个 m&lt; n 如何通过回溯方法解决这个问题我认为我的代码中的一些变化可以解决问题,但我不确定。

我用谷歌搜索但是没有找到任何解决这个问题的回溯解决方案吗?

2 个答案:

答案 0 :(得分:0)

您可以让函数queens有2个参数:

  1. 您当前已达到的列索引( num_column
  2. 放置在桌面上的皇后数量( num_queens
  3. 现在,您必须修复 [num_column, n] 之间的列以放置女王。 让 (i, j) 成为 i '行和 j '列( 1 <= i <= n num_column <= j <= n )。

    for j from num_column to n:
        for i from 1 to n:
            if check(i, j):
                col[j] = i
                queens(j + 1, num_queens + 1)
                //resetting the queen on j'th column
                col[j] = 0
    

    您可以在到达 num_queens == m 时停止此功能。

答案 1 :(得分:0)

答案比你想象的要容易得多!在常规N-queen问题中,我们会迭代kn次。所以我们可以在第一列(1到8之间)的任何地方添加我们的第一个女王,依此类推其他女王。

但是如果女王计数(m)小于我们的国际象棋大小(n),我们不得不将那位女王(我们的第一位皇后)放在第一列而不是所有地方(从1开始)直到64)并为其他女王做同样的事情。

所以你唯一需要做的就是迭代kn*n次,而不是n次。