求解數獨回溯算法

實現的java代碼如下(該算法只是將結果打印輸出,并沒有對原數組實現更改):

    //判斷a[i][j]取值val是否有效public boolean isValid(int[][] a, int i, int j, int val){//判斷是否跟同行沖突for(int j1=0;j1<9;j1++){if(a[i][j1]==val)return false;}//判斷是否跟同列沖突for(int i1=0;i1<9;i1++){if(a[i1][j]==val)return false;}//找出a[i][j]所在的九宮格int i1 = 0, j1 = 0;boolean flag = true;for(i1=0;i1<3&&flag;i1++){if(!(i>=i1*3&&i<3*(i1+1)))continue;for(j1=0;j1<3;j1++){if(j>=j1*3&&j<3*(j1+1)){flag = false;break;}}}i1--;//判斷值是否跟所在九宮格沖突for(int i2=3*i1;i2<3*(i1+1);i2++){           for(int j2=3*j1;j2<3*(j1+1);j2++){if(a[i2][j2]==val)return false;}}return true;}//打印數獨public void printMatrix(int[][] a){for(int i=0;i<9;i++){for(int j=0;j<9;j++){System.out.print(a[i][j]+" ");}System.out.println();}}//回溯法求解數獨public void shuDu(int[][] a, int i, int j){if(i==8&&j>=9){printMatrix(a);return;}if(j==9){j=0;i++;}if(a[i][j]==0){for(int k=1;k<=9;k++){if(isValid(a,i,j,k)){a[i][j] = k;//向下繼續找shuDu(a,i,j+1);//如果沒有找到全部答案將a[i][j]的值恢復a[i][j] = 0;}}}else{shuDu(a,i,j+1);}}

算法調用示例如下:

public static void main(String[] args) {Solution solu = new Solution();int ma1[][]={{0,3,0,0,0,5,0,6,0},{0,1,0,0,0,3,0,8,0},{0,4,0,0,0,0,0,0,7},{0,0,7,0,2,4,0,0,0},{5,0,0,0,9,0,0,0,0},{0,8,0,3,0,0,5,0,0},{0,0,0,8,0,0,0,0,0},{0,0,9,0,0,0,0,7,3},{0,5,0,9,0,0,0,0,2}};int[][] sudoku = { {8,0,0,0,0,0,0,0,0}, {0,0,3,6,0,0,0,0,0}, {0,7,0,0,9,0,2,0,0}, {0,5,0,0,0,7,0,0,0}, {0,0,0,0,4,5,7,0,0}, {0,0,0,1,0,0,0,3,0}, {0,0,1,0,0,0,0,6,8},  {0,0,8,5,0,0,0,1,0}, {0,9,0,0,0,0,4,0,0}};solu.shuDu(sudoku, 0, 0);
}            

?不進行打印,實現更改數組的改進算法(數組為字符數組,可根據需要進行更改):

public class Solution {//判斷a[i][j]取值val是否有效public boolean isValid(char[][] a, int i, int j, char val){//判斷是否跟同行沖突for(int j1=0;j1<9;j1++){if(a[i][j1]==val)return false;}//判斷是否跟同列沖突for(int i1=0;i1<9;i1++){if(a[i1][j]==val)return false;}//找出a[i][j]所在的九宮格int i1 = 0, j1 = 0;boolean flag = true;for(i1=0;i1<3&&flag;i1++){if(!(i>=i1*3&&i<3*(i1+1)))continue;for(j1=0;j1<3;j1++){if(j>=j1*3&&j<3*(j1+1)){flag = false;break;}}}i1--;//判斷值是否跟所在九宮格沖突for(int i2=3*i1;i2<3*(i1+1);i2++){           for(int j2=3*j1;j2<3*(j1+1);j2++){if(a[i2][j2]==val)return false;}}return true;} //回溯法求解數獨public boolean shuDu(char[][] a, int i, int j){if(i==8&&j>=9){return true;}if(j==9){j=0;i++;}if(a[i][j]=='.'){char ch = '1';for(int k=0;k<9;k++){if(isValid(a,i,j,(char)(ch+k))){a[i][j] = (char) (ch+k);//向下繼續找if(shuDu(a,i,j+1))return true;//如果沒有找到全部答案將a[i][j]的值恢復a[i][j] = '.';}}}else{if(shuDu(a,i,j+1))return true;}return false;}public void solveSudoku(char[][] board) {shuDu(board, 0, 0);}
}

?

轉載于:https://www.cnblogs.com/gaopeng527/p/4873447.html

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

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

相關文章

python語言屬于哪一種語言_Python與Java:你應該學習哪種語言,他們有什么區別?...

在企業招聘中&#xff0c; Python和Java經常是需求最大的編程語言。這兩種編程功能強大&#xff0c;靈活且面向對象的語言&#xff0c;通常在組織中和各種其他設置中使用。這可能會導致我們提出一個不可避免的問題&#xff1a;哪個更好&#xff1f; 這是一個復雜的問題&#xf…

關于手機端CSS Sprite圖標定位的一些領悟

今天在某個群里面閑逛&#xff0c;看見一個童鞋分享了一個攜程的移動端的頁面。地址這里我也分享下吧&#xff1a;http://m.ctrip.com/html5/在手機端我都很少用雪碧圖合并定位圖標&#xff0c;用的比較多就是用字體圖標來代替&#xff0c;有些圖標不多的時候就自己單個的切出來…

將Java向前推進? 一個定義。 一年回顧。

這篇文章是許多其他“年終”博客文章和評論之一。 但這并不是這樣。 我正在嘗試總結我在2011年所學到的有關Oracle和Java的知識&#xff0c;還試圖解釋“將Java向前推進”對我的意義以及我認為應該更好或更簡單地改變的東西。 感謝您全年關注我的博客&#xff0c;也感謝您在Twi…

c語言程序源代碼_程序的編譯、鏈接和執行

同學們總是抱怨每次見到一道面試題都很難把它轉化為程序源代碼。然而不幸的是&#xff0c;即使是程序源代碼對于計算機來說也還是太高級了。要想讓計算機執行一段程序&#xff0c;我們必須把它翻譯成最底層的機器指令才行。這其中要經歷很多步驟。幸運的是有很多現成的工具可以…

Ubuntu下tftp服務器的搭建

參考博客&#xff1a;http://blog.chinaunix.net/uid-26495963-id-3206829.html1. 安裝$ apt-get install tftp-hpa tftpd-hpa2. 建立目錄$ mkdir /tftpboot # 這是建立tftp傳輸目錄。$ sudo chmod 777 /tftpboot$ sudo touch test.txt # test.txt文件最好輸入內容以便區分3. 配…

【程序員眼中的統計學(1)】信息圖形化:第一印象

信息圖形化&#xff1a;第一印象 作者 白寧超 2015年10月13日23:23:13 摘要&#xff1a;程序員眼中的統計學系列是作者和團隊共同學習筆記的整理。首先提到統計學&#xff0c;很多人認為是經濟學或者數學的專利&#xff0c;與計算機并沒有交集。誠然在傳統學科中&#xff0c;其…

JBoss AS 7.0.2“ Arc”發布–使用綁定選項

有關JBoss AS7方面的更多好消息。 JBoss AS 7.0.2.Final“ Arc”已經發布&#xff01; 自AS 7.0.1發布以來已經過去了一個月。 在這短時間內&#xff0c;已修復了許多錯誤&#xff0c;并實現了更多功能和改進。 所有這些錯誤修復和功能已包含在此7.0.2版本中。 此新版本主要包…

C語言開發筆記(五)字符串常量

#include <stdio.h> #include <string.h>int main(void) {char *str "sting";strcpy(str, "hello");printf("%s\n", str);return 0; } 代碼為什么會運行錯誤&#xff0c;異常退出&#xff1f; 這段代碼是新手常見錯誤之一。 定義…

不屬于python標準庫的是_python標準庫和擴展庫

Tkinter ———— Python 默認的圖形界面接口。 Tkinter 是一個和 Tk 接口的模塊&#xff0c; Tkinter 庫提供 了對 Tk API 的接口&#xff0c;它屬于 Tcl/Tk 的 GUI 工具組。 Tcl/Tk 是由 John Ousterhout 發展的書寫和 圖形設備。 Tcl( 工具命令語言 ) 是個宏語言&#xff0c…

Android N 新特性 + APP開發注意事項

1. 多窗口MultiWindow 多窗口MultiWindow&#xff0c;這是Android N里對開發者影響比較大的特性&#xff0c;也是大家疑問比較多的地方。站在開發者的角度其實不必太擔心這個特性會導致我們需要修改很多代碼來適配系統。Google的工程師們也不希望這個特性導致很多應用出現問題&…

C語言開發筆記(六)實參和形參

舉例說明 #include <stdio.h>void swap(int x, int y) {int temp 0;temp x;x y;y temp; }int main(void) {int a 1, b 2;swap(a, b);printf("a%d, b%d\n", a, b);return 0; }結果為 在函數調用時&#xff0c;a的值傳給x&#xff0c;b的值傳給y。執行完…

Spring Singleton,請求,會話Bean和線程安全

由眾多有用框架組成的Spring框架生態系統已成為許多Java EE應用程序的基礎。 但是在所有Spring產品的核心中&#xff0c;我們仍然擁有Spring DI / IOC框架&#xff0c;該框架將Spring推向了新的高度。 隨著越來越多的人將Spring MVC或JSF-Spring集成用于他們的應用程序&#xf…

some fragments

1.fullpage 2.one page.js 3.scrollReveal.js 4.wow.js 5.瀏覽器前綴&#xff1a; -webkit- &#xff1a; Safari&#xff0c;Chrome -o- &#xff1a; Opera -moz- &#xff1a; Firefox -ms- &#xff1a; IE   6.css3過渡動畫&#xff1a;transitio…

面試之ajax原理(轉載)

總結1 總結2 AJAX全稱為“Asynchronous JavaScript and XML”&#xff08;異步JavaScript和XML&#xff09;&#xff0c;是一種創建交互式網頁應用的網頁開發技術&#xff0c; 是幾種原有技術的結合體。它由下列技術組合而成。 1.使用CSS和XHTML來表示。 2. 使用DOM模型來交互和…

優化方案電子版_關于小區分支道路整修設計方案的討論稿(No.2020121)

各位業主&#xff0c;大家好&#xff01; 關于綠洲比華利花園主干道翻新和次干道整修前期勘查和設計方案&#xff0c;經業委會及小區專家小組、設計單位申都設計公司工程設計人員結合本小區的實際情況進行了深入討論&#xff0c;優化設計&#xff0c;形成如下三個獨立方案&…

OSGI和Spring動態模塊–簡單的Hello World

在此姿勢中&#xff0c;我們將采用使用OSGi進行的第一個實現&#xff0c;并使用Spring Dynamic Modules改進應用程序。 Spring動態模塊&#xff08;Spring Dm&#xff09;使基于OSGi的應用程序的開發更加容易。 這樣&#xff0c;服務的部署就容易得多。 您可以像其他任何Spring…

C語言代碼規范(五)函數參數個數

一個函數的參數的數目過多&#xff08;尤其是超過8個&#xff09;顯然是一種不可取的編程風格。參數的數目直接影響調用函數的速度&#xff0c;參數越多&#xff0c;調用函數越慢。 參數的數目少&#xff0c;程序就顯得精練、簡潔&#xff0c;這有助于檢查和發現程序中的錯誤。…

vijos P1740 聰明的質檢員

題目鏈接:傳送門 題目大意:給你n個物品&#xff0c;每件物品有重量 W 和價值 V&#xff0c;給m個區間&#xff0c;和一個標準值。(n,m最大200000) 要求找到一個值x&#xff0c;使得m個所有區間的權值和與標準值的差的絕對值最小。單個區間權值計算公式(數目num0&#xff0c;價值…

為什么有的開關電源需要加自舉電容?

一、什么是自舉電路&#xff1f; 1.1 自舉的概念 首先&#xff0c;自舉電路也叫升壓電路&#xff0c;是利用自舉升壓二極管&#xff0c;自舉升壓電容等電子元件&#xff0c;使電容放電電壓和電源電壓疊加&#xff0c;從而使電壓升高。有的電路升高的電壓能達到數倍電源電壓。…

VS2010報錯 error:LINK1123:轉換到COF期間失敗,文件無限或損壞

右鍵工程-配置屬性-清單工具-輸入和輸出&#xff0c;嵌入清單一項重新選擇為否&#xff0c;如下圖 修改后重新生成和運行&#xff0c;發現程序正常運行了。