0

このコードは、8×8 のチェス盤に 8 つのクイーンを配置して、水平、垂直、斜めに攻撃しないようにするためのものです。詳細については、ウィキペディアのリンクhttp://www.google.co.in/url?sa=t&rctを参照してください。 =j&q=8%20queens%20problem&source=web&cd=1&cad=rja&sqi=2&ved=0CDEQFjAA&url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FEight_queens_puzzle&ei=XKbdUMbqLIn4rQfCoICACA&usg=AFQjCNEXFxAwqTUrl19GJ9Y9yh97g5hGFg&bvm=bv.1355534169,d.bmk

#include<iostream>
#include<conio.h>
using namespace std;
int recu(int i,int k);
void place(int i,int k);
void unplace(int i,int k);
int q[8][8];
/*flags for blocks*/
int row[8]; 
int column[8]; /*flag for column*/
int c[15];  /*flag for diagonls*/
int d[15];
int main()
{
    for(int i=0;i<8;i++) /*initalize flags */
    {
        row[i]=0;
        column[i]=0;
        c[i]=0;
        d[i]=0;
    }
    for(int i=8;i<15;i++)  /*initalize flag diagonals*/
    {
        c[i]=0;d[i]=0;
    }
    int i=0;
    int k=0;
    recu(i,k);  

    for(int i=0;i<8;i++)    /*for display output*/
    {
        for(int k=0;i<8;i++)
        {
            if(q[i][k]==1)
            {
                cout<<"(";
                cout<<i;
                cout<<",";
                cout<<k;
                cout<<")";
            }
        }
    }
    getch();
    return 0;
}

int recu(int i,int k)
{ 
    if(k<8)
    {
        if(column[i]==0 && row[k]==0 && c[i+k]==0 && d[i-k+7]==0)
        {
            place(i,k);
            k=0;
            recu(i+1,k);
        }
        else
            k++;
    }
    else
        unplace(i,k);
    return 0;
}

void place(int i,int k)
{
    q[i][k]=1;
    row[i]=1;
    column[k]=1;
    c[i+k]=1;
    d[i-k+8]=1;
}

void unplace(int i,int k)
{
    q[i][k]=0;
    row[i]=0;
    column[k]=0;
    c[i+k]=0;
    d[i-k+7]=0;
}

出力を取得していますが、(0,0) と (7,0) のみです。

4

1 に答える 1

1

私が見る限り、問題は確かです:

int q[7][7] 

これにはインデックスからの整数があります

[0-6][0-6]

これは 7*7 フィールドをモデル化します。

int q[8][8]8*8 フィールドが必要です。

さらに、対角配列のサイズも 14 ではなく 15 にする必要があります。

于 2012-12-28T13:44:26.860 に答える