p1219洛古八皇后

2021-09-25 05:06:00 字數 804 閱讀 7710

#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 ...