洛谷P1219 八皇后

題目描述

檢查一個以下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行、每列有且只有一個,每條對角線(包括兩條主對角線的全部平行線)上至多有一個棋子。ios

上面的佈局能夠用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有一個棋子,以下:ide

行號 1 2 3 4 5 6佈局

列號 2 4 6 1 3 5spa

這只是跳棋放置的一個解。請編一個程序找出全部跳棋放置的解。並把它們以上面的序列方法輸出。解按字典順序排列。請輸出前3個解。最後一行是解的總個數。code

輸入輸出格式

輸入格式:blog

一個數字N (6 <= N <= 13) 表示棋盤是N x N大小的。io

輸出格式:event

前三行爲前三個解,每一個解的兩個數字之間用一個空格隔開。第四行只有一個數字,表示解的總數。class

輸入輸出樣例

輸入樣例#1:stream

6

輸出樣例#1:
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

代碼以下

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 const int N = 101;        //對角線 2n - 1 
 5 int n, cnt = 0;
 6 int path[N], col[N], dg[N], undg[N];    //col 列  dg 對角線  undg 反對角線  
 7 void dfs(int u){
 8     if(u == n){
 9         if(cnt < 3){
10             for(int i = 0; i < n; i++)    printf("%d ", path[i]);
11             printf("\n");
12        }
13         cnt++;
14         return;            /***/
15    }
16    for(int i = 0; i < n; i++){
17        if(!col[i] && !dg[u + i] && !undg[i - u + n]){
18            path[u] = i + 1;
19            col[i] = dg[u + i] = undg[i - u + n] = 1;
20            dfs(u + 1);
21            col[i] = dg[u + i] = undg[i - u + n] = 0;
22        }
23    }
24 }
25 int main(){
26     scanf("%d", &n);
27     dfs(0);
28     printf("%d\n", cnt);
29     return 0;
30 }    
八皇后
相關文章
相關標籤/搜索