八皇后问题的java代码 。boolean[] diagonal = new boolean[16]; // 对角线安全标志
boolean[] undiagonal = new boolean[16]; // 反对角线安全标志
用上两个判断是否能放置棋子
在 n 行 n 列的国际象棋棋盘上,最多可布n个皇后 。
若两个皇后位于同一行、同一列、同一对角线上,
则称为它们为互相攻击 。
n皇后问题是指找到这 n 个皇后的互不攻击的布局 。
n 行 n 列的棋盘上 , 主次对角线各有2n-1条 。
利用行号i和列号j计算
主对角线编号k的方法是k = n i-j-1;
计算次对角线编号k的方法是k = i j
你主要是算法有些模糊罢了,现在我怕我说的不好将你弄的越来越混乱所以给你个叫形象的若是还不明白 , call me
package 百度;
//演示程序:n个皇后问题
import java.io.*;
/*
在 n 行 n 列的国际象棋棋盘上,最多可布n个皇后 。
若两个皇后位于同一行、同一列、同一对角线上,
则称为它们为互相攻击 。
n皇后问题是指找到这 n 个皇后的互不攻击的布局 。
n 行 n 列的棋盘上,主次对角线各有2n-1条 。
利用行号i和列号j计算
主对角线编号k的方法是k = n i-j-1;
计算次对角线编号k的方法是k = i j
*/
//"n个皇后问题"之类定义
public class cQueen {
int n;//皇后问题的大小
int col[]; //数组,各列上有无皇后(0,1)
int md[];//数组,各主对角线有无皇后(0,1)
int sd[];//数组,各次对角线有无皇后(0,1)
int q[];//数组,第i行上皇后在第几列(0,n-1)
int Q;//已布皇后数 , 计数
int r;//n皇后问题的解的组数
//构造函数 n皇后问题的初始化
public cQueen(int m) {
n=m;Q=0;r=0;
col=new int[n];
md=new int[2*n-1];//初始化0
sd=new int[2*n-1];
q=new int[n];
}
//函数:打印棋盘
public void showBoard() {
int i,j;
for(i=0;in;i) {
for(j=0;jn;j)
if(q[i]==j) System.out.print("1 ");
else System.out.print("0 ");
System.out.println();
}
r; //解的组数
System.out.println("---------------");
}
//求解n皇后问题
/*
此函数试图在n*n的棋盘的第i行上放一个皇后,
若找到可以放的位置,就递归调用自身试图在i 1行
放另一个皇后,若第i行是最后一行,则打印棋盘 。
*/
public void resolve(int i) {
int j;
// 在第i行给定后检查棋盘上的每一列
for(j=0;jn;j) {
//如果在第i行的第j列可以布放皇后
if(col[j]==0md[n i-j-1]==0sd[i j]==0){
Q;q[i]=j; //布放皇后,第i行皇后在第几列
// 标记新布皇后的攻击范围
col[j]=md[n i-j-1]=sd[i j]=1;
// 如果已经布了n个皇后(得到了一组解),
// 把棋盘(解)打印出来 。
if(Q==n) showBoard();
// 否则,递归 。在第i行第j列布放皇后的前提下,
//试探下一行(i 1行)在哪一列布皇后?
else if(in-1) resolve(i 1);
else resolve(0); //因为约定起始行可以任选
//移除在第i行的第j列新布的皇后,
//并消除所标记的攻击范围,为回溯作准备 。
Q--;q[i]=0;
col[j]=md[n i-j-1]=sd[i j]=0;
//试探在第i行的第j 1列新布皇后的方案(新解)
}
} //下一列 , j循环
//对于给定的行,列扫描完毕后,从这里回溯 。
}
//输出解的个数
public void HowMany() {
System.out.println(n "皇后问题共有解" r "组 。");
}
//主方法main()
public static void main(String []args) {
//定义一个8皇后问题(有92组解)
cQueenQ1=new cQueen(8);//大于10,你的微机可能要死机!
//第一个皇后可以在任意一行布放
Q1.resolve(0);//参数在0到n-1之间任选
Q1.HowMany();
}
}//类Queen定义结束
关于看代码的人人都知道的小技巧,最小试探法来输出结果进行比较和分析
用Java程序打印出国际象棋的棋盘样子import java.awt.Canvas;
import java.awt.Graphics;
import javax.swing.JFrame;
public class IC extends Canvas{
private static final long serialVersionUID = -2611185708860234130L;
public void paint(Graphics g){
int s = 50;//单元格大小
int c = 0;//可取0或1以改变第一单元格是否填充
int rc=10;//行列数
for(int i=0; irc; i){
c;
if(rc )c;
for(int j=0; jrc; j){
g.drawRect(i*s,j*s,s,s);
if(c%2!=0)
g.fillRect(i*s,j*s,s,s);
}
}
g.dispose();
}
public static void main(String[] args){
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(600,600);
f.setLocationRelativeTo(null);
f.getContentPane().add(new IC());
f.setVisible(true);
}
}
上面是直接按你的要求在画布上打印的,下面是有组件排版的:
import java.awt.Color;
import javax.swing.*;
public class Chess extends JPanel{
private static final long serialVersionUID = -5380742576273506004L;
//grids:行数和列数, gridsize:单元格的高和宽
public Chess(int grids,int gridsize){
super(null);
for(int i=0; igrids; i){
for(int j=0; jgrids; j){
JLabel l = new JLabel();
l.setSize(gridsize,gridsize);
l.setLocation(i*gridsize i,j*gridsize j);
if((i j)%2==0){
l.setBackground(Color.black);
l.setOpaque(true);
}
l.setBorder(BorderFactory.createLineBorder(Color.black));
add(l);
}
}
}
public static void main(String[] args){
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(620,645);
f.setLocationRelativeTo(null);
f.add(new Chess(10,60));
f.setVisible(true);
}
}
注:这些已经很简单了,如果还看不懂,你回去再多补补基础吧!
国际象棋JAVA棋谱 用什么软件生成?最好别用flash象棋棋子走法java代码,使用网页代码是相对较简单象棋棋子走法java代码的 。
看看汕头棋院网上象棋棋子走法java代码的贴棋谱实例及教程就可以象棋棋子走法java代码了 。
【象棋棋子走法java代码 象棋游戏java编程】关于象棋棋子走法java代码和象棋游戏java编程的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 号下载,新疆保密公众号下载
- 希捷硬盘装系统怎么分区,希捷硬盘怎么升级固件
- netmvc角色管理,net user管理员权限
- 卫星锅高清直播设备,直播卫星电视
- 如何连接oracle数据 oracle如何连接oracle数据源
- 输入学号显示名字c语言,c语言输入学号
- 永恒之塔服务器,永恒之塔服务器连接中断怎么解决
- 想独立开发游戏,想做独立游戏开发者需要什么
- 为什么c语言函数要用指针 c语言中为什么要用指针