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

本文探讨了洛谷P1219八皇后问题,介绍了一个使用Java深度优先搜索(DFS)解决该问题的方法。文章通过示例解释了如何找到棋盘上放置棋子的解,并给出了程序的输出格式。此外,还提供了AC代码作为解决方案,并提到与N皇后问题的相似性和不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


洛谷 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.youkuaiyun.com/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]);
				
				
			}
			
		}
		
	}*/

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值