我最近读到了关于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;
}
答案 0 :(得分:1)
确定
假设您有国际象棋网格。
对于横向和纵向冲突,您可以使用存储set
和i
(行和列)女王位置的j
。如果另一位女王拥有相同的i
或j
- 冲突。
主题:
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;