八皇后問題是在8*8的棋盤上放置8枚皇后,使得棋盤中每個縱向、橫向、左上至右下斜向、右上至左下斜向均只有一枚皇后。八皇后的一個可行解如圖所示:
#include <iostream>
using namespace std;
int queen[8][8] = {0};
int resultNum = 0;
bool Check(int row, int column); //判斷當第row-1行放置好皇后後,第row行的第column列能否放置皇后
void Solve(int row); //解決第row行的皇后放置問題
void PrintResult(); //打印結果
int main()
{
Solve(1);
return 0;
}
bool Check(int row, int column) //判斷當第row-1行放置好皇后後,第row行的第column列能否放置皇后
{
int i, j;
if(row == 1) //第一行的任何一列都可以放置皇后
return true;
//如果在第1行到第n-1行的column列上放置有皇后,則在第row行第column列上就不能放置皇后
for(i=0; i<row-1; i++)
{
if(queen[i][column-1] == 1)
return false;
}
//如果在第row行第column列的左上對角線上有皇后,則在第row行第column列上就不能放置皇后
//i = row -1;
//j = column - 1;
i = row-2;
j = i-(row-column);
while(i>=0 && j>=0)
{
if(queen[i][j] == 1)
return false;
i--;
j--;
}
//如果在第row行第column列的右上對角線上有皇后,則在第row行第column列上就不能放置皇后
//i = row -1;
//j = column + 1;
i = row-2;
j = row+column-i-2;
while(i>=0 && j<=7)
{
if(queen[i][j] == 1)
return false;
i--;
j++;
}
return true;
}
void Solve(int row) //解決第row行的皇后放置問題
{
int j; //j掃描列
for(j=0; j<8; j++)
{
queen[row-1][j] = 1; //在第row行,第j+1列上放置皇后,看是否可行
if(Check(row, j+1) == true) //爲true,說明在第row行,第j+1列上可以放置皇后
{
if(row == 8) //row爲8,說明已經解決到了最後一行,直接打印結果
PrintResult();
else //else的情況爲還沒到第8行,繼續解決下一行,即第row+1行
Solve(row + 1);
}
queen[row-1][j] = 0; //取出該列的皇后,進行回溯,在其他列放置皇后
}
}
void PrintResult() //打印結果
{
resultNum++;
cout << "Answer " << resultNum << ": " << endl;
for(int i=0; i<8; i++)
{
for(int j=0; j<8; j++)
cout << queen[i][j] << " ";
cout << endl;
}
}