挑战程序设计竞赛(算法和数据结构)——19.1八皇后问题的JAVA实现
Posted 小乖乖的臭坏坏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挑战程序设计竞赛(算法和数据结构)——19.1八皇后问题的JAVA实现相关的知识,希望对你有一定的参考价值。
题目&思路:
对每一行的每一列进行放置皇后的操作,如果满足要求则放置皇后,更新限制数组,放置后对下一行进行放置皇后的操作,不断回溯。如果产生冲突,则对这一行的下一列进行操作,由于问题总是有解的,故总能搜索到答案。
代码:
import java.util.Scanner;
public class Puzzle
public static final int FREE = -1;
public static final int NOT_FREE = 1;
public static final int N = 8;
public static void main(String[] args)
int row[] = new int[N];
int col[] = new int[N];
int dpos[] = new int[2*N-1];
int dneg[] = new int[2*N-1];
boolean X[][] = new boolean[N][N];
//初始化
for (int i=0;i<N;i++)
row[i] = FREE;
col[i] = FREE;
for (int i=0;i<2*N-1;i++)
dpos[i] = FREE;
dneg[i] = FREE;
for (int i=0;i<N;i++)
for (int j=0;j<N;j++)
X[i][j] = false;
Scanner cin = new Scanner(System.in);
int k = cin.nextInt();
for (int i=0;i<k;i++)
int r = cin.nextInt();
int c = cin.nextInt();
X[r][c] = true;
recursive(0, row, col, dpos, dneg, X);
public static void recursive(int i, int row[], int col[], int dpos[], int dneg[], boolean X[][])
if(i==N)//成功放置皇后
printBoard(X, row);return;
for (int j=0;j<N;j++)
//如果(i,j)受到其他皇后攻击,则忽略该格子
if(NOT_FREE == col[j] ||
NOT_FREE == dpos[i+j] ||
NOT_FREE == dneg[i-j+N-1])continue;
//在(i,j)放置皇后
row[i] = j;
col[j] = dpos[i+j] = dneg[i-j+N-1] = NOT_FREE;
//尝试下一行
recursive(i+1, row, col, dpos, dneg, X);
//如果经过层层回溯还没有完成,那就说明冲突,说明这个位置的皇后放的不对,因此拿掉摆放在(i,j)的皇后
col[j] = dpos[i+j] = dneg[i-j+N-1] = FREE;
//皇后放置失败
public static void printBoard(boolean X[][], int row[])
for (int i=0;i<N;i++)
for (int j=0;j<N;j++)
if(X[i][j])
if(row[i]!=j)return;
for (int i=0;i<N;i++)
for (int j=0;j<N;j++)
System.out.print(((row[i]==j)?"Q":"."));
System.out.println();
输入:
2
2 2
5 3
输出:
......Q.
Q.......
..Q.....
.......Q
.....Q..
...Q....
.Q......
....Q...
以上是关于挑战程序设计竞赛(算法和数据结构)——19.1八皇后问题的JAVA实现的主要内容,如果未能解决你的问题,请参考以下文章
挑战程序设计竞赛(算法和数据结构)——分割(下)&快速排序的JAVA实现
挑战程序设计竞赛(算法和数据结构)——19.2九宫格拼图问题的JAVA实现
挑战程序设计竞赛(算法和数据结构)——7.1归并排序JAVA实现
挑战程序设计竞赛(算法和数据结构)——16.13线段相交问题(曼哈顿算法)的JAVA实现