n皇后問題java_經典n皇后問題java代碼實現

問題描述:在n*n的二維表格,把n個皇后在表格上,要求同一行、同一列或同一斜線上不能有2個以上的皇后。

例如八皇后有92種解決方案,五皇后有10種解決方案。

public class TestQueen {

int n; //皇后的個數

int num = 0; // 記錄方案數

int[] queenCol; // 記錄n個皇后所占用的列號

boolean[] col; // 列安全標志

boolean[] diagonal; // 對角線安全標志

boolean[] undiagonal; // 反對角線安全標志

public TestQueen(int n) {

this.n = n;

queenCol = new int[n];

col = new boolean[n];

diagonal = new boolean[2 * n - 1];

undiagonal = new boolean[2 * n - 1];

for (int i = 0; i < n; i++)

// 置所有列為安全

col[i] = true;

for (int t = 0; t < (2 * n - 1); t++)

// 置所有對角線為安全

diagonal[t] = undiagonal[t] = true;

}

public void run() {

solve(0);

if (num == 0) {

System.out.println(n + "皇后無解!");

}

}

// 從i行開始,把之后的皇后放好

private void solve(int i) {

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

if (col[j] && diagonal[i - j + n - 1] && undiagonal[i + j]) {

// 表示第i行第j列是安全的可以放皇后(i,j從0開始)

queenCol[i] = j;

col[j] = false; // 修改安全標志

diagonal[i - j + n - 1] = false;

undiagonal[i + j] = false;

if (i < n - 1) // 判斷是否放完n個皇后

{

solve(i + 1); // 未放完n個皇后則繼續放后面的

} else // 已經放完n個皇后

{

num++;

System.out.println("皇后擺放第" + num + "種方案:");

System.out.print("行分別為");

for (int k = 0; k < n; k++)

System.out.print(k + " ");

System.out.print("\n");

System.out.print("列分別為");

for (int k = 0; k < n; k++)

System.out.print(queenCol[k] + " ");

System.out.print("\n");

}

col[j] = true; // 修改安全標志,回溯

diagonal[i - j + n - 1] = true;

undiagonal[i + j] = true;

}

}

}

public static void main(String[] args) {

TestQueen q = new TestQueen(5);

q.run();

}

}

輸出結果:

皇后擺放第1種方案:

行分別為0 1 2 3 4

列分別為0 2 4 1 3

皇后擺放第2種方案:

行分別為0 1 2 3 4

列分別為0 3 1 4 2

皇后擺放第3種方案:

行分別為0 1 2 3 4

列分別為1 3 0 2 4

皇后擺放第4種方案:

行分別為0 1 2 3 4

列分別為1 4 2 0 3

皇后擺放第5種方案:

行分別為0 1 2 3 4

列分別為2 0 3 1 4

皇后擺放第6種方案:

行分別為0 1 2 3 4

列分別為2 4 1 3 0

皇后擺放第7種方案:

行分別為0 1 2 3 4

列分別為3 0 2 4 1

皇后擺放第8種方案:

行分別為0 1 2 3 4

列分別為3 1 4 2 0

皇后擺放第9種方案:

行分別為0 1 2 3 4

列分別為4 1 3 0 2

皇后擺放第10種方案:

行分別為0 1 2 3 4

列分別為4 2 0 3 1

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2011-10-19 20:51

瀏覽 1957

評論

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453622.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453622.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453622.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ffmpeg mplayer x264 代碼重點詳解 詳細分析

ffmpeg和mplayer中求平均值得方法 1 ordinary c language level #define avg2(a,b) ((ab1)>>1) #define avg4(a,b,c,d) ((abcd2)>>2) 顯而易見&#xff0e;&#xff0e;&#xff0e;&#xff0c;注意a&#xff0c;b宏表達式可能引出的副作用 2 SIMD by software…

nagios監控服務器的搭建

nagios 概述&#xff1a; 開源的免費的網絡監視工具。 監控&#xff1a; windows, Linux,Unix,交換機和路由器。報警。 Nagios是插件式的結構&#xff0c;它本身沒有任何監控功能&#xff0c;所有的監控都是通過插件進行的&#xff0c;因此其是高度模塊化和富于彈性的。Nagios…

BZOJ1031: [JSOI2007]字符加密Cipher

1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7882 Solved: 3425[Submit][Status][Discuss]Description 喜歡鉆研問題的JS同學&#xff0c;最近又迷上了對加密方法的思考。一天&#xff0c;他突然想出了一種他認為是終極的加密辦法&#…

java棧頂元素_棧在Java類庫中的實現

棧是一種后進先出的數據結構。在它之上&#xff0c;主要有三種操作&#xff1a;(1)判斷棧是否為空——empty()&#xff1b;(2)在棧頂添加一個元素——push(E)&#xff1b;(3)刪除并返回棧頂元素——pop()。在Java類庫中&#xff0c;Stack類實現了棧&#xff0c;它繼承自Vector類…

LoadRunner遠程監測Centos服務性能配置過程

由于公司的需要&#xff0c;經過一段時間的探索&#xff0c;參考了很多業內人士的文檔&#xff0c;終于完成LoadRunner遠程監測centos服務器的配置過程。 首先監測所需要服務是否存&#xff0c;如果存在就不必要安裝&#xff0c;如果不存在&#xff0c;需要安裝對應的服務。 監…

day 68 增刪改查 語法

1 普通正則 2 分組正則 url(r/blog/(\d)/(\d),views.blog) blog(request,arq1,arq2) 按照位置傳參 3 分組命名 url(r/blog/(?P<year>\d)/(?P<month>\d),views.blog) blog(request,year,month) 4 用name 指定別名 url(r/blog/(?P<year>\d)/(?P…

編譯器入門 語法分析器 java_從零開始寫個編譯器吧 - Parser 語法分析器

Parser(語法分析器)的編寫相對于 Tokenizer (詞法分析器)要復雜得多&#xff0c;因此&#xff0c;在編寫之前可能也會鋪墊得更多一些。當然&#xff0c;本系列旨在“寫出”一個編譯器&#xff0c;所以理論方面只會簡單介紹 tao 語言所涉及的部分。之前的幾章中&#xff0c;我純…

017——數組(十七) asort ksort rsort arsort krsort

<?php /*** 數組 asort ksort rsort arsort krsort*///asort()對數組按值排序&#xff0c;保留鍵名&#xff1a; /*$arrarray(bbs_url>bbs.lantian.com,web_url>www.lantian.com,bbs_name>免費視頻教程,www_name>PHP項目開發, ); asort($arr); print_r($arr);…

v4l打開video設備 ,執行VIDIOC_DQBUF,出現Resource temporarily unavailable 問題

如果你在執行VIDIOC_DQBUF突然提示以下錯誤&#xff1a; error: VIDIOC_DQBUF: Resource temporarily unavailable 那么很可能是你使用非阻塞方式打開設備文件的造成的。 Resource temporarily unavailable是一種EAGAIN的錯誤。EAGAIN是較常見的一種錯誤(比如用在非阻塞操作…

ubuntu下無法獲得鎖 /var/lib/dpkg/lock - open (11: 資源暫時不可用)

sudo apt-get install git E: 無法獲得鎖 /var/lib/dpkg/lock - open (11: 資源暫時不可用) E: 無法鎖定管理目錄(/var/lib/dpkg/)&#xff0c;是否有其他進程正占用它&#xff1f; 當執行sudo apt-get相關的命令&#xff0c;會顯示上面類似的錯誤 參考別人的解決方法是 sudo r…

java get方法不序列化_Java中的Json序列化,不容忽視的getter

在開發的過程中&#xff0c;經常會碰到和自己預期不一樣的情況。有的時候自己去研究一下還是很有趣的。這兩天在寫java web的時候&#xff0c;碰到了一個對象序列化的問題。問題重現public class AjaxJson {private boolean success;private String msg;private Object obj;pri…

mysql 通過echo的方式寫入數據庫 中文亂碼解決方案

echo "set names utf8;insert into xxx (path, sn, time, flag) values ($wav, $sn, $secs, op);" | MYSQL echo "set names utf8;insert into xxx (path, sn, time, flag) values ($wav, $sn, $secs, op);" 前面增加 set names utf8;

getParameter和getAttribute的區別

轉自http://blog.csdn.net/java_xiaobin/article/details/45363897 1.getAttribute是取得jsp中 用setAttribute設定的attribute 2.parameter得到的是string&#xff1b;attribute得到的是object 3.request.getParameter()方法傳遞的數據&#xff0c;會從Web客戶端傳到Web服務器…

java int字母,從Java中獲取int,也包含字母

How can I get the int value from a string such as 423e - i.e. a string that contains a number but also maybe a letter?Integer.parseInt() fails since the string must be entirely a number.解決方案Unless youre talking about base 16 numbers (for which theres …

Spring-data-jpa常用方法

轉載于:https://www.cnblogs.com/summary-2017/p/7904926.html

面試問題匯總 精選 分析 解答 職業規劃 part 1

C/C/C#面試題精選&#xff08;1&#xff09; 題目&#xff08;一&#xff09;&#xff1a;C中我們可以用static修飾一個類的成員函數&#xff0c;也可以用const修飾類的成員函數&#xff08;寫在函數的最后表示不能修改成員變量&#xff0c;不是指寫在前面表示返回值為常量&am…

java byte md5_Java開發網 - byte[]按自定義編碼轉換成String(MD5)

差不多了&#xff0c;這樣應該就可以了&#xff0c;剩下的就是擴展能接受的類型了。import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class HashPasswords {public String getPassword(byte[] input) {byte[] digest;synchronized (…

Java線程生命周期

當你需要使用Java線程在多線程環境下進行編程時&#xff0c;理解Java的線程周期與線程的狀態是非常重要的。通過實現Runnale接口或者繼承Thread類&#xff0c;我們可以創建線程&#xff0c;為了啟動一個線程&#xff0c;我們需要創建一個Thread對象&#xff0c;并且調用它的sta…

轉,JSON解析2

JSON 使用講解 這篇文章講解了&#xff0c;JSON的介紹以及使用GSON解析。今天&#xff0c;我們就在Android項目中使用兩種方式解析JSON數據。如果你對JSON&#xff0c;還不熟悉&#xff0c;那么請看JSON 使用講解。 一.搭建服務以及制造JSON數據。 1.服務器選擇的Tomcat&#x…

面試問題匯總 精選 分析 解答 職業規劃 part 2

面試困惑問與答&#xff08;2&#xff09;——感覺挺好&#xff0c;為啥被拒了&#xff1f; 問&#xff1a;技術面試的時候&#xff0c;題目挺簡單的&#xff0c;我覺得自己都做出來了。可最后怎么還是被拒了啊&#xff1f; 答&#xff1a;面試被拒有很多種可能&#xff0c;比…