1. 程式人生 > >n皇后問題回溯法---java圖形介面實現回溯過程

n皇后問題回溯法---java圖形介面實現回溯過程

/*<span style="white-space:pre">	</span>by wbin  2015/12/18
實現n皇后問題的回溯法過程,以java圖形介面展示,程式碼寫得略醜,見諒.*/
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Label;

import javax.swing.JFrame;

public class Main {
	JFrame frame;
	int n=8;			//問題規模
	int waitTime=500;	//時間間隔
	Label mp[][]=new Label[n+1][n+1];
	Thread thread;
	public void create(){
		frame=new JFrame(String.valueOf(n)+"皇后問題");
		frame.setLayout(new GridLayout(n,n));
		Font font=new Font("",Font.BOLD,32);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				mp[i][j]=new Label();
				if((i+j)%2==0){
					mp[i][j].setBackground(Color.black);
				}
				else{
					mp[i][j].setBackground(Color.white);
				}
				mp[i][j].setFont(font);
				mp[i][j].setForeground(Color.blue);
				frame.add(mp[i][j]); 
			}
		}
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(n*60, n*60); 
		frame.setVisible(true);
		thread=Thread.currentThread();
		
		try {
			dfs(1);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	int vis[]=new int[n+1];
	int ans=0;
	public void dfs(int row) throws InterruptedException{
		if(row==n+1){
			ans++;
			System.out.print("第"+ans+"種擺法為:");
			for(int i=1;i<=n;i++){
				System.out.print(vis[i]+",");
			}
			System.out.println();
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					mp[i][j].setForeground(Color.green);
				}
			}
			thread.sleep(3*waitTime);
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					mp[i][j].setForeground(Color.blue);
				}
			}
			return;
		}
		else{
			for(int i=1;i<=n;i++){
				vis[row]=i;
				if(i>1)
					mp[row][i-1].setText("");
				mp[row][i].setText("K");
				boolean state=check(row);
				thread.sleep(waitTime);
				for(int z=1;z<=n;z++){
					for(int j=1;j<=n;j++){
						if((z+j)%2==0){
							mp[z][j].setBackground(Color.black);
						}
						else{
							mp[z][j].setBackground(Color.white);
						}
					}
				}
				if(state){
					dfs(row+1);
				}
				mp[row][i].setText("");
			}
		}
	}
	
	public boolean check(int row){
		boolean flag1=true,flag2=true,flag3=true;
		int row1=1,row2=1,row3=1;
		for(int i=1;i<row;i++){
			if(vis[i]==vis[row]){
				flag1=false;
				row1=i;
			}
			if( (i-row)==(vis[i]-vis[row])){	
				flag2=false;
				row2=i;
			}
			if((i-row)==-(vis[i]-vis[row])){
				flag3=false;
				row3=i;
			}
		}
		if(!flag1){
			for(int i=row;i>=row1;i--)
				mp[i][vis[row]].setBackground(Color.red);
		}
		if(!flag2){
			for(int i=row,j=vis[row];i>=row2;i--,j--){	
				mp[i][j].setBackground(Color.red);
			}
		}
		if(!flag3){
			for(int i=row,j=vis[row];i>=row3;i--,j++){
				mp[i][j].setBackground(Color.red);
			}
		}
		if(!flag1 || !flag2 || !flag3)
			return false;
		return true;
	}
	
	public static void main(String args[]){
		javax.swing.SwingUtilities.invokeLater(new Runnable(){
			@Override
			public void run() {
				// TODO Auto-generated method stub
				(new Main()).create();
			}
		});	
	}
}

相關推薦

n皇后問題回溯---java圖形介面實現回溯過程

/*<span style="white-space:pre"> </span>by wbin 2015/12/18實現n皇后問題的回溯法過程,以java圖形介面展示,程式碼寫得略醜,見諒.*/import java.awt.Color; impo

【資料結構與演算法】回溯解決N皇后問題,java程式碼實現

N皇后問題 問題描述 在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法,這稱為八皇后問題。 延伸一下,便為N皇后問題。 核心思想 解決N皇后問題有兩個關鍵點。一是如何進行放置棋子,二是如何驗證棋子是否符合

回溯解決N皇后問題(java實現

1.簡單介紹回溯法思路,就是將所有的結果變成一棵樹,從樹的結點開始訪問,採用深度優先策略,從樹的根結點開始訪問,如果滿足條件,繼續訪問下一層,如果不滿足條件,返回上一個結點,繼續訪問其它結點。重複操作。 2. 對於N皇后問題,我特意做了一張圖片。首先放置第一

JS使用WebSocket實現Java圖形介面(swing)進行通訊

背景:做專案的時候有過這樣的一個需求,在訪問某個網頁的時候進行登入,需要瀏覽器獲取電腦的硬體資源,但是通過瀏覽器直接讀取的方式有些不便,所以想到使用Java開發一個圖形應用介面的程式讀取電腦程式通過socket通訊傳輸給html頁面用於驗證。 寫在前面:在Java伺服器這端

Java圖形介面實戰案例——實現打字母遊戲

實現打字母的遊戲 這次這個案例可以說是頭幾次所講的內容的一個技術彙總,主要是 運用了幾大塊的知識。我們先來定義一下案例的背景:在一個300*400的窗體上,有10個隨機產生的字母下落,在鍵盤上敲擊字母,若是敲對了就消掉,初始化的成績為1000分,每次敲對一個

java圖形介面程式設計換面板

前言 總所周知,java圖形介面效果不是特別理想,於是在網上找了一些非常好看的面板 面板地址:面板地址 使用 下載了一款名為weblaf的面板,使用也很簡單,匯入jar包後,在main方法中,JFrame定義之前呼叫install();方法即可。 public

Linux下,Java圖形介面程式中文顯示不正常(顯示為方格)問題解決

RedHat或其它Linux系統下中文顯示為方格,原因是JRE環境中中文字型設定異常。 1.首先找到JRE所在的目錄,如在RedHat Enterprise 6中的目錄為:/usr/lib/jvm/java-1.6.0/jre 2.將windows中文字型simsun.ttf或simsun.ttc拷

Java 圖形實現一個驗證電話號碼是否合法的程式

package com.wxj; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton;

java圖形介面設定求商 求差

/* 2 編寫一個Java Application圖形介面的程式,實現兩數相減、相除的功能 (1) 在兩個文字框裡分別輸入兩個數字,單擊“求差”、“求商”按鈕,則在第三個文字框裡顯示運算結果; (2) 當輸入的不是數字或者除數為0時,要求用訊息對話方塊向用戶報錯; (3) 單擊視窗右上角的“X”按鈕

leetcode:電話號碼的字母組合回溯java

大牛們第一次用回溯,寫前幾天剛看了,有問題謝謝幫指出。謝謝你們的支援!  package LeetCode; import java.util.ArrayList; import java.util.List; public class PhoneNumeber {

Java圖形介面的基本設計

一、圖形介面的基本設計思路: 1,建立一個窗體,利用窗體類 2,向窗體中新增標籤,標籤類 3,向窗體中新增按鈕,按鈕類 二、詳細程式碼  注意:1,在建立的這個介面類中需要繼承監聽介面來實現相應的增大字型的功能。       &nb

Java圖形介面-JComboBox

JComboBox的事件處理亦可分為兩種,一種是取得使用者選取的專案;另一種是使用者在JComboBox上自行輸入完畢後按下[Enter]鍵, 運作相對應的工作。對於第一種事件的處理,我們使用ItemListener.對於第二種事件的處理,我們使用ActionListen

關於Java使用介面實現多重繼承

首先在我們使用介面可以實現Java的多重繼承,這裡為什麼Java自身不提供多重繼承的機制呢? 這裡有一種被稱為菱形繼承的危險: 如圖,我們有一個動物基類,本身帶有一個叫聲的方法。我們在其派生類狗和貓中分別重寫這個方法分別輸出二者的叫聲。這裡問題就來了,如果我們有一個

Java圖形介面事件監聽處理

                              Java圖形介面事件監聽處理 文章開始把我喜歡的這句話送個大家:這個世界上還有什麼比自己

java圖形介面視覺化開發3大GUI外掛

上大學那會兒比較主流的Java圖形開發外掛是:Visual Editor 和 SWT Designer, 不久又出了個Jigloo, 但去官網看了下發現這個東西也很久沒有更新了,不過據說短小精悍,五臟俱全。SWT Designer不久前也被Google收購後重新整合進自己

java調介面實現傳送手機簡訊驗證碼功能,手機驗證碼,介面呼叫

近來由於專案需要,需要用到手機簡訊驗證碼的功能,其中最主要的是用到了第三方提供的簡訊平臺介面WebService客戶端介面,下面我把我在專案中用到的記錄一下,以便給大家提供個思路,由於本人的文采有限,還請大家見諒! 一:首先上幾張案例截圖,以便大家可以瞭

Java Serializable介面實現問題

JavaBeans       要了解Serializable介面之前先來了解最基本的JavaBeans。JavaBeans為我們提供了最簡單的Java類實體,這些實體伴隨著業務在應用中來回穿梭。Ja

JAVA圖形介面設計

圖形介面設計 1 Java Swing 概述 圖形化介面(Graphics User Interface,GUI)是指採用圖形方式顯示的計算機操作使用者介面。 通過圖形化介面,使用者和程式之間可以方便地進行互動。Java的抽象視窗工具包(Abstract Window Toolkit,

Java 圖形介面開發--圖文並茂建立學生管理系統

           圖形使用者介面(Graphics User Interface,GUI)是使用者與程式互動的視窗,比命令列的介面更加直觀並且更好操作。      這是本人在學習java圖形介面開發階段一步一步實現的超級簡易的學生管理系統。雖然說不入大神法眼,但這確實是費

Java圖形介面——選項卡窗格、面板元件、網格佈局

package com.test.swing; import java.awt.*; import javax.swing.*; public class QLogin extends JFrame{ //定義元件 //北部區域 JLabel jl1; //