洛谷 P1219 八皇后问题——java dfs

    xiaoxiao2022-07-07  222


    洛谷 P1219 八皇后问题


    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。

    上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下:

    行号 1 2 3 4 5 6

    列号 2 4 6 1 3 5

    这只是跳棋放置的一个解。请编一个程序找出所有跳棋放置的解。并把它们以上面的序列方法输出。解按字典顺序排列。请输出前3个解。最后一行是解的总个数。

    //以下的话来自usaco官方,不代表洛谷观点

    特别注意: 对于更大的N(棋盘大小N x N)你的程序应当改进得更有效。不要事先计算出所有解然后只输出(或是找到一个关于它的公式),这是作弊。如果你坚持作弊,那么你登陆USACO Training的帐号删除并且不能参加USACO的任何竞赛。我警告过你了!

    输入输出格式 输入格式: 一个数字N (6 <= N <= 13) 表示棋盘是N x N大小的。

    输出格式: 前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。

    输入输出样例 输入样例#1: 6 输出样例#1: 2 4 6 1 3 5 3 6 2 5 1 4 4 1 5 2 6 3 4 此题跟n皇后问题类似,在此插入我的N皇后问题https://blog.csdn.net/qq_42472682/article/details/90451515 有不懂的可以参考一下, 不同之处就在于这个需要输出,那就再设个一维数组进行存储,再写个方法进行输出; 以下附上我的ac代码:

    package aa; import java.util.Scanner; public class Main { private static int n; private int[] column; private int[] rup; private int[] lup; private static int[] qq; private int[] quee; private static int sum=0; private static String str=""; public Main() { column=new int[n]; rup=new int[2*n-1]; lup=new int[2*n-1]; quee=new int[n]; for(int i=0;i<n;i++) { column[i]=0; } for(int i=0;i<(2*n-1);i++) { rup[i]=lup[i]=0; } } private void dfs(int i) { // TODO Auto-generated method stub if(i>(n-1)) { sum++; if(sum<4) { show(); } }else { for(int j=0;j<n;j++) { if((column[j]==0)&&(rup[i+j]==0)&&(lup[i-j+(n-1)]==0)) { quee[i]=j; column[j]=rup[i+j]=lup[i-j+(n-1)]=1; dfs(i+1); column[j]=rup[i+j]=lup[i-j+(n-1)]=0; } } } } private void show() { // TODO Auto-generated method stub for(int i=0;i<n;i++) { str+=(quee[i]+1)+" "; } System.out.println(str.trim()); str=""; } public static void main(String args[]) { Scanner sc=new Scanner(System.in); n=sc.nextInt(); Main queen=new Main(); queen.dfs(0); System.out.println(sum); } /*public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(System.in); qq=new int[11]; for(int i=0;i<11;i++) { qq[i]=-1; } while(sc.hasNext()) { sum=0; n=sc.nextInt(); if(n==0) break; else { if(qq[n]==-1) { Main queen=new Main(); queen.dfs(0); qq[n]=sum; } System.out.println(qq[n]); } } }*/ }
    最新回复(0)