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