8个女王拼图冲突检查

时间:2014-05-31 04:44:22

标签: c++ conflict n-queens

我最近读到了关于8个皇后问题并尝试用C ++自己解决它。我创建了一个名为eq.h的类,一个名为eq.cpp的实现文件和一个main.cpp。

我不确定的是,如何检查行,列和对角线冲突?我想的是,使用嵌套for循环进行冲突检查。怎么能应用?我为此创建了一个valid()函数。以下是我到目前为止所做的事情。

1)eq.h

#ifndef 8QUEEN_H
#define 8QUEEN_H

#include <iostream>
#include <algorithm>

using namespace std;

class 8queen
{
        public:
            8queen();
            ~8queen();
            int solve();//solve problem using next_permutation
            void display();

        private:
            bool valid();
            int queens[8]; //array to store 8 integers that represent 8 queens
};
#endif

2)eq.cpp

#include "eq.h"
#include <iostream>
#include <algorithm>

using namespace std;

8queen::8queen()
{
    for(int i=0;i<0;i++)
    {
        queens[i]=i;
    }
}

8queen::~8queen()
{

}

//using next_perm, return all possible positions of the queens
int 8queen::solve()
{
    int count=0;
    do{
        if(valid())
        {
            count++;
            display();
        }
    }
    while(next_permutation(queens,queens+8));
    return count;
}

//display the positions of the queens
void 8queen::display()
{
    for(int i=0; i<0;i++)
    {
        cout<<queens[i]<<' ';
    cout<<endl;
    }
}

//check if position is valid or not
bool 8queen::valid()
{
    return true;
}

3)main.cpp

#include "eq.h"
#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    8queen object;


    cout<<object.solve()<<endl;
}

2 个答案:

答案 0 :(得分:1)

确定

假设您有国际象棋网格。

对于横向和纵向冲突,您可以使用存储seti(行和列)女王位置的j。如果另一位女王拥有相同的ij - 冲突。

主题:

SET
row_set contains? (i) - conflict

column_set contains? (j) - conflict

对角线冲突(从左角到右角)
更复杂的情况。 假设您在(1,1)上有女王,并想在(8,8)上放置新女王 所以这种情况可能会发生冲突。当然。
如果差值(j - i)相同,则会发生这种情况。

假设您在(1,7)上有女王,并希望将女王放在(2,8)上 同样,差异值(j - i)在这里是相同的。

对角线冲突(从右角到左角)

假设您在(8,1)上有女王,并希望将新女王放在(1,8)上 冲突。
如果总和值(j + i)相同,则会发生这种情况 假设您在(1,2)上有女王,并希望将新女王放在(2,1)上 冲突!
它发生的原因是总和值相同(j + i)

主题:

SET
left_to_right_set contains? (j - i) - 冲突
right_to_left_set contains? (j + i) - 冲突

我希望这会对你有所帮助

答案 1 :(得分:0)

请考虑以下代码。 c[0][i]包含一行中的皇后数,c[1][i]包含一列中的皇后数,d[0][i]包含反向对角线的皇后数,d[1][i]包含用于皇后数量的皇后数量一个主要的对角线。编辑它以处理8x8网格而不是4x4网格。

int c[2][4] = {}, d[2][7] = {};
for (int i = 0; i < 4; ++i) {
    for (int j = 0; j < 4; ++j) {
        char x;
        cin >> x;
        if (x != 'x') continue;
        ++c[0][i], ++c[1][j];
        ++d[0][i + j], ++d[1][i + (3 - j)];
    }
}
for (int i = 0; i < 4; ++i)
    if (c[0][i] > 1 || c[1][i] > 1)
        return true;
for (int i = 0; i < 7; ++i)
    if (d[0][i] > 1 || d[1][i] > 1)
        return true;
return false;

Live example.