JAVA中的变成求解8皇后问题

作者&投稿:宗政黄 (若有异议请与网页底部的电邮联系)
Java 八皇后问题解释~

public class Queen{//同栏是否有皇后,1表示有private int[] column;//右上至左下是否有皇后private int[] rup;//左上至右下是否有皇后private int[] lup;//解答private int[] queen;//解答编号private int num;public Queen(){column=new int[8+1];rup=new int[(2*8)+1];lup=new int[(2*8)+1];for(int i=1;i8){showAnswer();}else{for(int j=1;j<=8;j++){if((column[j]==0)&&(rup[i+j]==0)&&(lup[i-j+8]==0)){//若无皇后queen[i]=j;//设定为占用column[j]=rup[i+j]=lup[i-j+8]=1;backtrack(i+1); //循环调用column[j]=rup[i+j]=lup[i-j+8]=0;}}}} protected void showAnswer(){num++;System.out.println("
解答"+num); for(int y=1;y<=8;y++){for(int x=1;x<=8;x++){if(queen[y]==x){System.out.print("Q");}else{System.out.print(".");}} System.out.println();}} public static void main(String[]args){Queen queen=new Queen();queen.backtrack(1);}}

递归:
首先每一行放置均会循环,也就是每一行的皇后都会被依次放置在8个位置上;
1)第一行在第一个位置上放置1枚皇后;
2)第二行在第一个位置上放置皇后,如果与已有的皇后不在一条直线上,则进入下一行,否则位置+1;
3)余下几行均依照步骤2)的方法进行放置,当最后一行放置好,打印输出;
可以写个函数,EightQueen(int n, int *Pos),其中n表示第几行,Pos指向一个数组,Pos[i]=j表示第i行的位置是j;EightQueen(int n, int *Pos)从n=1开始递归,到n=8递归结束。
代码就不写了,没写过java,写不来

public class EightQueens {

// 棋盘的row或者是column

public static final int BOARD_SIZE = 8;

// 表示一个空的放置位置

public static final int EMPTY = 0;

// 标记一个位置是否已经被放置了皇后

public static final int QUEEN = 1;

// 记录解的总个数

private static int count = 0;

// 表示棋盘

private int[][] board;

public EightQueens() {

// 创建一个空棋盘

board = new int[BOARD_SIZE][BOARD_SIZE];

}

// 设置所有的位置为EMPTY

public void clearBoard() {

for (int i = 0; i < BOARD_SIZE; i++) {

for (int j = 0; j < BOARD_SIZE; j++) {

board[i][j] = EMPTY;

}// end for

} // end for

}

// 显示结果

public void displayBoard() {

String str = "";

for (int i = 0; i < BOARD_SIZE; i++) {

for (int j = 0; j < BOARD_SIZE; j++) {

if (board[i][j] == EMPTY) {

str += 0 + " ";

} else {

str += 1 + " ";

}

}

str += "
";

}

System.out.println(str);

}

// 放置皇后

public void placeQueens(int row, int column) {

if (column >= BOARD_SIZE) {

System.out.println("结果: " + (++count));

displayBoard();

// queenPlaced = true;

} else {

while (row < BOARD_SIZE) {

if (isUnderAttack(row, column)) {

// 位置(row, column)在皇后的攻击范围中,继续判断下一个位置

row++;

} else {

// 在位置(row,column)放置皇后

setQueen(row, column);

// 放置下一列的皇后(递归)

placeQueens(0, column + 1);

// 移除该位置的皇后

removeQueen(row, column);

// 继续试探该列的下一个位置

row++;

}// end if

} // end while

} // end if

}

// 在给定的位置(row, column)放置一个皇后(QUEEN)

private void setQueen(int row, int col) {

board[row][col] = QUEEN;

}

// 移走给定位置(row, column)的皇后

private void removeQueen(int row, int col) {

board[row][col] = EMPTY;

}

// 确定给定的位置是否在其他皇后的攻击之中

private boolean isUnderAttack(int row, int col) {

// 皇后可以攻击四个方向即:

// 南北方向 <--> 没必要考虑(控制j < col)

// 东西方向 <--> i == row

// 西北--东南方向 <--> (col-row) == (j-i)

// 西南--东北方向 <--> (row+col) == (i+j)

boolean isAttack = false;

for (int i = 0; i < BOARD_SIZE; i++) {

for (int j = 0; j < col; j++) {

if (board[i][j] == QUEEN) {

isAttack = (i == row) || ((i + j) == (row + col))

|| (col - row == j - i);

// 位置(row, col)在攻击范围中,返回!

if (isAttack)

return true;

}

}// end for

}// end for

// 该位置可以放置皇后

return false;

}

public static void main(String[] args) {

EightQueens eq = new EightQueens();

// System.out.println(eq.placeQueens(0));

// eq.displayBoard();

eq.placeQueens(0, 0);

}

}



58种,我书上说的

94


AVA电脑配置问题
以这配置玩战地之王无压力,如果是本的话,温度可能会很高,而且这个游戏对显卡要求不大...

我的电脑室WIN7的,我玩AVA是不是全屏,而且进入战斗画面时画面会缩小在...
ava最近更新的可以窗口化,进入游戏点设置,画面设置底下把勾勾都去掉就可以了

ava里AK74M的瞄准镜是原装的好还是加4倍的好?【高分】【速度求解】!
4倍acog 瞄准镜加上后,ak74m性能更像连狙,3-4发击毙。扫射时强烈跳动,很恶心。。。1.5倍 不适合远距离点射(但这个是ak74m强过ak47的地方),更适合近战(问题是谁会在近战是开镜?)所以,建议加上acog *4x 近距离关镜扫射,远了开镜点(对付Sniper(狙击手)都不成问题)。当然,如果你...

玩AVA死亡峡谷开加速为什么会开死机 游戏关不掉 只能重启电脑 求解
加速本来就容易让程序出问题

AVA 全特效怎么调 参数什么样的。我这种电脑配置可以 开全特效吗?_百 ...
全开 没问题,AVA里面有设置,自己找找,在选项里面,有视频选项

战地之王AVA狙击瞄准问题
好吧,我玩狙击也是有点经验的。就给你个解释,满不满意我也不知道了。首先。。我要说这是一个意识问题。以卡农之战地图为例,我喜欢在中路,不知道你懂不懂,就是站在墙的后面,利用网络延迟,微出,利用快速开镜,射击,回到墙后,开微出,开镜……你的准心要对准对面的墙的出口,我上传了一...

我这样的配置可以玩AVA吗!!!求解
完全可以

AVA打战队赛。进了战队主页点什么就可以打了啊。。朋友说点匹配...
有房间页,可以选择的,和CF差不多。

ava安装不了
1.你不是从官网上下的,这是病毒。2.你的电脑本来就有病毒。不管怎样,你中奖了。

ava卡是怎么回事?
你用驱动精灵更新一下配置,看看你网速卡不卡,把那些无用的软件关掉,如果按上的说都不行的话,下个网游加速器用,要不然重新下载AVA一遍,如果还不行就是腾讯又黑新玩家,优化变烂,比直流韩服还慢2倍了现在,他们的腾讯画质都降了那么多,又想干毛,如果你家是网通的话我推荐你去下韩服AVA,绝对...

荷塘区18833731956: 求java八皇后问题代码 -
璩娄长春: 别人的代码 你看看吧//8 Queen 递归算法 //如果有一个Q 为 chess[i]=j; //则不安全的地方是 k行 j位置,j+k-i位置,j-k+i位置 class Queen8{ static final int QueenMax = 8; static int oktimes = 0; static int chess[] = new int[QueenMax];//每一个Queen...

荷塘区18833731956: java八皇后问题急!!!求代码和比较详细的解释,请给我比较仔细
璩娄长春: public class demo { public static int N = 0; public static int ROW = 8; public int[][] chase = new int[demo.ROW][demo. ROW]; public demo() { for (int i = 0; i = 0 && i - j >= 0) ...

荷塘区18833731956: java:八皇后问题解题思路
璩娄长春: 递归: 首先每一行放置均会循环,也就是每一行的皇后都会被依次放置在8个位置上; 1)第一行在第一个位置上放置1枚皇后; 2)第二行在第一个位置上放置皇后,如果与已有的皇后不在一条直线上,则进入下一行,否则位置+1; 3)余下几行均依照步骤2)的方法进行放置,当最后一行放置好,打印输出; 可以写个函数,EightQueen(int n, int *Pos),其中n表示第几行,Pos指向一个数组,Pos[i]=j表示第i行的位置是j;EightQueen(int n, int *Pos)从n=1开始递归,到n=8递归结束. 代码就不写了,没写过java,写不来

荷塘区18833731956: java八皇后问题的实验报告 -
璩娄长春: http://blog.itweb2.com/article.asp?id=140 ** 8皇后问题:** 问题描述:* 在一个8*8的棋盘里放置8个皇后,要求每个皇后两两之间不相冲突*(在每一横列,竖列,斜列只有一个皇后).** 数据表示:* 用一个 8 位的 8 进制数表示棋盘上...

荷塘区18833731956: 请教JAVA大神,我这个八皇后问题代码如何修改?不求新代码,求修正.谢谢 -
璩娄长春: 问题很多 第一个问题,你这里一排有多个1 是因为循环的判断错误.}while(a[c][temp]==1); 应该改成}while(a[c][temp]==0); 第二个问题, 你没有退出最里层循环的步骤,这样导致,只要数据不和第一排冲突,就会通过.你应该在每个 a[c][d]=0; 后加上 break;第三个问题,也是最大的问题.你为什么要用随机数.8皇后不是怎么摆都会成功的,有可能中途就卡死了.用随机数碰上卡死的话就会死循环了.你应该在一定实验后放弃当前的摆法.这个改动就比较大了,没法直接改了.

荷塘区18833731956: java八皇后问题求大神帮忙修改 -
璩娄长春: 你的判断函数valid是错的,j1应该循环到行尾 修正如下 static boolean valid(int n,int j){ boolean boo=true; for(int i1=0;i1 for(int j1=0;j1 if(board[i1][j1]==2) if((j1==j)||(n-i1)==Math.abs(j-j1)) boo=false; return boo; }另外输出需要分隔开每组解,在输出解的语句后、return语句前加上一个System.out.println();即可

荷塘区18833731956: 请给一个八皇后问题的JAVA源代码,其中使用了栈 -
璩娄长春: public class Queue { private final int size; //棋盘大小 private int[] location; //皇后再列的位置 private int[] colsOccupied; //皇后在棋盘上占据的列 private int[] cross1Occupied; //皇后再棋盘上占据的对角线 private int[] cross2Occupied; //皇后在...

荷塘区18833731956: 求:N皇后问题的JAVA代码
璩娄长春: 这是我刚写的程序 程序如下: import java.util.*; import java.io.*; public class NQueens { public static void print(int a[]){//输出解 //int b[]=a; for(int i=1,j=a.length-1;i<a.length;i++,j--){ System.out.print(a[i]+"--"); //b[j]=a[i];//记录对称解 } a[0]++; System....

荷塘区18833731956: java求解:8行8列的矩阵中填入8个字母Q,要求不能在同行同列或任意对角线重复出现,并且是随机不能手动设定 -
璩娄长春: /* *这是八皇后问题 *用回溯法解决 *输出:1 5 8 6 3 7 2 4*表示第一行第一列放Q 第二行第五列放Q 依次类推 *输出所有可能的放法 * */ public class NQueens { private int X[];//创建一个数组,数组中元素X[i]表示第i行第X[i]列放Q /* *检查k行是否...

荷塘区18833731956: java越界问题求高手指教~! -
璩娄长春: 方法play改成如下,否则在原方法中find(i)返回的x和y已经是-1了,又调用了put方法,在给数组赋值时i[-1][-1]就报错了.同时在判断了x为-1时,应该return一下,不应该继续play.void play(int[][] i) { int x = find(i).x; int y = find(i).y; if (x == -1) { show(i); return; }play(put(i, x, y)); }

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网