首页 > 解决方案 > 支配 n 皇后谜题

问题描述

我已经解决了泛型 n-queen 问题,但我正在寻找一种算法来解决 5 个皇后统治问题,在这个问题中,你必须用 5 个皇后和 8x8 棋盘控制棋盘中的所有方格。我想为此打印所有可能的解决方案(此问题中可用的 4860 个解决方案),但我的代码不会这样做。

#include <iostream>

using namespace std;

int i;
bool q;
bool a[9];
bool b[17];
bool c[17];
int x[9];

void clear(){
    for(int i = 1;i<=8;i++)
        a[i] = true;
    for(int i = 2;i<=16;i++)
        b[i] = true;
    for(int i = -7;i<=7;i++)
        c[i] = true;
}

void printboard(){
    cout << "Berhasil!!" << endl;
    for(int j=1;j<=8;j++){
        for(i=1;i<=8;i++){
            if(j == x[i])
                cout<<"K ";
            else
                cout << "* ";
        }
        cout << "\n";
    }
}

bool isfull(){
    for(int i = 1;i<=8;i++)
        if(a[i] == false)
            return false;
    for(int i = 2;i<=16;i++)
        if(b[i] == false)
            return false;
    for(int i = -7;i<=7;i++)
        if(c[i] == false)
            return false;
}

void trys(int i,bool &q,int step){
    int j;
    j = 0;
    do{
        j+=1;
        q=false;
        x[i] = step;
        a[j] = false;
        b[i+j] = false;
        c[i-j] = false;
        if(step<5){
            trys(i+1,q,step+1);
            if(!q){
                a[j] = true;
                b[i+j] = true;
                c[i-j] = true;
            }
        }else{
            if(isfull){
                printboard();
                clear();
                q = true;
            }
        }
    }while(true);
}

int main(){

        clear();
//      for(int i = 1;i<=8;i++)
//          x[i] = true;
        trys(i,q,0);
//      if(q){
//          cout << endl;
//          printboard();   
//      }
}

这段代码是我从 Niklaus Wirth 那里得到的,并做了一些修改。

标签: c++backtrackingchesspuzzlen-queens

解决方案


推荐阅读