POJ 3239
发布日期:2021-06-30 15:30:47 浏览次数:2 分类:技术文章

本文共 3571 字,大约阅读时间需要 11 分钟。

Solution to the n Queens Puzzle

Time Limit: 1000MS   Memory Limit: 131072K
Total Submissions: 4006   Accepted: 1466   Special Judge

Description

The eight queens puzzle is the problem of putting eight chess queens on an 8 × 8 chessboard such that none of them is able to capture any other. The puzzle has been generalized to arbitrary n × n boards. Given n, you are to find a solution to the n queens puzzle.

Input

The input contains multiple test cases. Each test case consists of a single integer n between 8 and 300 (inclusive). A zero indicates the end of input.

Output

For each test case, output your solution on one line. The solution is a permutation of {1, 2, …, n}. The number in the ith place means the ith-column queen in placed in the row with that number.

Sample Input

80

Sample Output

5 3 1 6 8 2 4 7

Source

, Yao, Jinyu

大致题意:

N皇后问题:

      在NxN棋盘内 纵、横、斜不重叠放置棋子,

      当给定N (N ∈ [8, 300]) 时, 输出任意一种解法

解题思路:

采用构造法:

 而目前网上流传的通解公式,则是为了便于编程,在坐标变换后得到的:

     变换坐标后的求解公式如下:
     ① 当m mod 6 != 2 且 m mod 6 != 3时:
       (A1):[2,4,6,8,...,m], [1,3,5,7,...,m-1]            (m为偶)
       (A2):[2,4,6,8,...,m-1], [1,3,5,7,...,m-2], [m]     (m为奇)
 
     ② 当m mod 6 == 2 或 m mod 6 == 3时,
      令 n= m / 2 (m为偶数) 或 n = (m-1)/2 (m为奇数)
       (B1):[n,n+2,n+4,...,m], [2,4,...,n-2], [n+3,n+5,...,m-1], [1,3,5,...,n+1]        (m为偶,n为偶)
       (B2):[n,n+2,n+4,...,m-1], [1,3,5,...,n-2], [n+3,...,m], [2,4,...,n+1]            (m为偶,n为奇)
       (B3):[n,n+2,n+4,...,m-1], [2,4,...,n-2], [n+3,n+5,...,m-2], [1,3,5,...,n+1], [m] (m为奇,n为偶)
       (B4):[n,n+2,n+4,...,m-2], [1,3,5,...,n-2], [n+3,...,m-1], [2,4,...,n+1], [m]     (m为奇,n为奇)
      
     上面有六条解序列: 
       一行一个序列(中括号是我额外加上的,以便辨认子序列)
       第i个数为j,表示在第i行j列放一个皇后.
       子序列与子序列之间的数序是连续关系(无视中括号就可以了), 所有子序列内j的递增值为2 
 

代码:

#include 
#include
#include
#include
#include
using namespace std; void queens_puzzle(int n)//n>=8{ if(n%6!=2 && n%6!=3) { printf("2"); for(int i=4;i<=n;i+=2) printf(" %d",i); for(int i=1;i<=n;i+=2) printf(" %d",i); printf("\n"); } else { int k=n/2; if(n%2==0 && k%2==0) { printf("%d",k); for(int i=k+2;i<=n;i+=2) printf(" %d",i); for(int i=2;i<=k-2;i+=2) printf(" %d",i); for(int i=k+3;i<=n-1;i+=2) printf(" %d",i); for(int i=1;i<=k+1;i+=2) printf(" %d",i); } else if(n%2==1 && k%2==0) { printf("%d",k); for(int i=k+2;i<=n-1;i+=2) printf(" %d",i); for(int i=2;i<=k-2;i+=2) printf(" %d",i); for(int i=k+3;i<=n-2;i+=2) printf(" %d",i); for(int i=1;i<=k+1;i+=2) printf(" %d",i); printf(" %d",n); } else if(n%2==0 && k%2==1) { printf("%d",k); for(int i=k+2;i<=n-1;i+=2) printf(" %d",i); for(int i=1;i<=k-2;i+=2) printf(" %d",i); for(int i=k+3;i<=n;i+=2) printf(" %d",i); for(int i=2;i<=k+1;i+=2) printf(" %d",i); } else { printf("%d",k); for(int i=k+2;i<=n-2;i+=2) printf(" %d",i); for(int i=1;i<=k-2;i+=2) printf(" %d",i); for(int i=k+3;i<=n-1;i+=2) printf(" %d",i); for(int i=2;i<=k+1;i+=2) printf(" %d",i); printf(" %d",n); } printf("\n"); }}int main(){ int n; while(~scanf("%d",&n)) { if(!n) break; queens_puzzle(n); } return 0;}

 

转载地址:https://joycez.blog.csdn.net/article/details/82790724 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:POJ 1068
下一篇:POJ 3295

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月20日 00时15分17秒