8 Queen Problem
八皇后問題
在 8 * 8 的棋盤上擺入八個皇后,兩兩之間不能在同一行、同一列或對角線上, 求出共幾種解法並印出。
思路
可利用遞迴方式解決,每次放一個新的都與前面作比較,檢驗是否合格。
在 8 * 8 的棋盤上擺入八個皇后,兩兩之間不能在同一行、同一列或對角線上, 求出共幾種解法並印出。
思路
可利用遞迴方式解決,每次放一個新的都與前面作比較,檢驗是否合格。
#include<iostream>
#include<conio.h> // getch()
#include<cmath>
using namespace std;
#define max 8
int answer = 0; // 放外面 因為會一直累加
class QueenPuzzle
{
int queens[max];
public:
void print();
void place(int i); // 放入
int isValid(int n); // 放入第 n 個是否合格
};
void QueenPuzzle::print()
{
for(int i = 0; i < max; i++)
{
for(int j = 0; j < max; j++)
{
if(j == queens[i])
cout << "Q ";
else
cout << "1 ";
}
cout << endl; // 排完一列 換行
}
if(getch() == 'q') // 按 q 鍵正常退出
exit(0);
}
void QueenPuzzle::place(int i)
{
for(int j = 0; j < max; j++)
{
if(i == max)
{
answer++;
cout << "第 " << answer << " 組解: " << endl;
print();
return;
}
queens[i] = j;
if(isValid(i)) // 成功 下面一位 如果不行 就回到迴圈 j++ 往右一格
place(i+1);
}
}
int QueenPuzzle::isValid(int n)
{
for(int i = 0; i < n; i++) // 和前面幾個作比較
{
if(queens[i] == queens[n]) // 同一列
return 0;
if(abs(queens[n] - queens[i]) == n - i) // 在對角線上
return 0;
}
return 1;
}
int main(void)
{
QueenPuzzle puzzle;
puzzle.place(0);
cout << "共 " << answer << " 組解 " << endl;
}
留言
張貼留言