檢查一個以下的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
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 }