package com.plague.math;
隆化網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、APP開發(fā)、響應式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)2013年開創(chuàng)至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設就選成都創(chuàng)新互聯(lián)。
import java.lang.Math;
public class Chess {
private final static int CHESS_NUMBER = 64;
private int total;
public Chess () {
System.out.println("國王的賞賜,其實,問題是這樣的:" +
"在國際象棋的棋盤上,第一格放一粒米,第二格放2粒米,第三個放四粒米。。。最后國王要賞賜多少米");
for (int i = 0; i CHESS_NUMBER; i++) {
total += Math.pow(2.0,(double)i);
}
System.out.println("國王的賞賜是:"+total);
}
public static void main(String[] args) {
Chess c1 = new Chess();
}
}
boolean[] diagonal = new boolean[16]; // 對角線安全標志
boolean[] undiagonal = new boolean[16]; // 反對角線安全標志
用上兩個判斷是否能放置棋子
在 n 行 n 列的國際象棋棋盤上,最多可布n個皇后。
若兩個皇后位于同一行、同一列、同一對角線上,
則稱為它們?yōu)榛ハ喙簟?/p>
n皇后問題是指找到這 n 個皇后的互不攻擊的布局。
n 行 n 列的棋盤上,主次對角線各有2n-1條。
利用行號i和列號j計算
主對角線編號k的方法是k = n+i-j-1;
計算次對角線編號k的方法是k = i+j
你主要是算法有些模糊罷了,現(xiàn)在我怕我說的不好將你弄的越來越混亂所以給你個叫形象的若是還不明白,call me
package 百度;
//演示程序:n個皇后問題
import java.io.*;
/*
在 n 行 n 列的國際象棋棋盤上,最多可布n個皇后。
若兩個皇后位于同一行、同一列、同一對角線上,
則稱為它們?yōu)榛ハ喙簟?/p>
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[]; //數(shù)組,各列上有無皇后(0,1)
int md[]; //數(shù)組,各主對角線有無皇后(0,1)
int sd[]; //數(shù)組,各次對角線有無皇后(0,1)
int q[]; //數(shù)組,第i行上皇后在第幾列(0,n-1)
int Q; //已布皇后數(shù),計數(shù)
int r; //n皇后問題的解的組數(shù)
//構造函數(shù) 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];
}
//函數(shù):打印棋盤
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++; //解的組數(shù)
System.out.println("---------------");
}
//求解n皇后問題
/*
此函數(shù)試圖在n*n的棋盤的第i行上放一個皇后,
若找到可以放的位置,就遞歸調(diào)用自身試圖在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;
// 如果已經(jīng)布了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循環(huán)
//對于給定的行,列掃描完畢后,從這里回溯。
}
//輸出解的個數(shù)
public void HowMany() {
System.out.println(n+"皇后問題共有解"+r+"組。");
}
//主方法main()
public static void main(String []args) {
//定義一個8皇后問題(有92組解)
cQueen Q1=new cQueen(8); //大于10,你的微機可能要死機!
//第一個皇后可以在任意一行布放
Q1.resolve(0); //參數(shù)在0到n-1之間任選
Q1.HowMany();
}
} //類Queen定義結(jié)束
關于看代碼的人人都知道的小技巧,最小試探法來輸出結(jié)果進行比較和分析
有,但是我不能直接給你。我可以告訴你步驟。
首先是加載圖片文件為 Image:比如你有個類叫 ResourceLoader 那么就添加下面的類成員:
public static final URL url = ResourceLoader.class.getResource("/xxx/.../文件名.png");
public static final Image img = Toolkit.getDefaultToolkit().createImage(url);
然后就加載好了。下一步是繼承一個 JPanel(例如),添加鼠標/鍵盤事件,并重寫 paint 方法(或 paintComponent 方法)。例如——
public class ChessPanel extends JPanel {
private Point[] chessPoints = new Point[共多少個棋子];
private boolean[] shown = new boolean[共多少個棋子];
@Override public void paintComponent (Graphics g) {
super.paintComponent(g);
for (int i=0; i共多少個棋子; i++) {
if (shown[i]) {
g.drawImage(ResourceLoader.img, chessPoints[i].x, chessPoints[i].y, 棋子寬度, 棋子高度);
}
}
}
class MouseControler extends MouseAdapter {
@Override public void mousePressed (MouseEvent me) {
//自己寫吧
repaint();
}
}
}
最后說明一下,圖片資源文件可以打包到 jar 里。我把關鍵的部分都已經(jīng)告訴你了。具體邏輯實現(xiàn)你自己寫吧。當然數(shù)據(jù)結(jié)構你也可以自己寫,我的例子只是告訴你相應的在 paint 或者 paintComponent 方法里全部畫出來就行了。
希望能采納。