#include
#include
using namespace std;
int ans[14],check[3][28]=,sum=0,n;
void eq(int line)
}for(int i=1;i<=n;i++)}}
int main()
**中,
陣列ans[line]=i表示第line行的第i列有乙個棋子,保證了每行只有乙個棋子;
陣列check保證了每列和每條對角線上只有乙個棋子,具體機制如下,沒有一些奇奇怪怪難以理解的公式:
check[0]儲存了棋子的列數,每一次進行ans[line]=i,使check[0][i]標記為已使用;
check[1]和check[2]儲存對角線上的棋子分布情況:
如圖,
對於一條從右上到左下的對角線,其上的棋子座標應滿足x+y為一定值;
對於一條從左上到右下的對角線,其上的棋子座標應滿足x-y為一定值,為了避免負數的產生,**中用x-y+n來儲存數字,具體效果讀者可以自行研究。
對於語句
if((!check[0][i])&&(!check[1][line+i])&&(!check[2][line-i+n]))
只要滿足這三個數字均為使用過,則在ans[line]=i處放置棋子,並將check陣列中的相應數值標記為已使用,並對下一行進行搜尋。
由於題目要求輸出前3組解,所以計數器sum>3時不輸出結果,最後在main函式中輸出最終解的數量。
洛谷 P1219 八皇后
題目描述 檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號 1 2 3 4 5 6 列號 2 ...
洛谷 P1219 八皇后
題目描述 檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號 1 2 3 4 5 6 列號 2 ...
洛谷p1219 八皇后
題目描述 檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號 1 2 3 4 5 6 列號 2 ...