Description
给定一个8*8棋盘,要求在棋盘上放8个皇后,并且各个皇后之间不能相互攻击。
当两个皇后位于同一行或同一列或同一对角线(有两条)就会相互攻击。
现在要求大家编程输出8皇后问题的所有解。
注意:皇后是逐行放的,也就要求大家输出每一行放皇后的列号的序列,行号和列号都是从1开始的
Input
无
Output
每一行输出一个解决方案; 要求输出所有方案。
每个解决方案是列号的序列,列号之间以空格隔开,行尾无多余空格。
行号和列号都是从1开始的
Sample Output
1 5 8 6 3 7 2 4
1 6 8 3 7 4 2 5
…
Solution
#include <iostream>
#include <vector>
using namespace std;
class Pair {
public:
int x;
int y;
Pair(int x, int y) {
this->x = x;
this->y = y;
}
bool operator == (Pair p) {
return p.x == x && p.y == y;
}
};
bool isValidToAnotherone(Pair p1, Pair p2) {
int diffX = p1.x-p2.x, diffY = p1.y-p2.y;
if (diffY == 0 || diffX == 0
|| diffX == diffY || diffX == -diffY) {
return false;
}
return true;
}
bool isValidPos(vector<Pair>& queenMap, Pair newQueen) {
for (int i = 0; i < queenMap.size(); i++) {
if (!isValidToAnotherone(queenMap[i], newQueen))
return false;
}
return true;
}
void printAns(vector<Pair>& queenMap) {
for (int i = 0; i < queenMap.size(); i++) {
if (i != queenMap.size()-1) {
cout << queenMap[i].y+1 << " ";
} else {
cout << queenMap[i].y+1 << endl;
}
}
}
void getMapAns(vector<Pair>& queenMap) {
int currentX = queenMap.size();
for (int y = 0; y < 8; y++) {
Pair newQueen = Pair(currentX, y);
if (isValidPos(queenMap, newQueen)) {
queenMap.push_back(newQueen);
if (queenMap.size() == 8) {
printAns(queenMap);
} else {
getMapAns(queenMap);
}
queenMap.pop_back();
}
}
}
int main() {
vector<Pair> queenMap;
getMapAns(queenMap);
}