<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
數獨是一項非常簡單的任務。如下圖所示,一張 9 行 9 列的表被分成 9 個 3*3 的小方格。在一些單元格中寫上十進位制數位 1~9,其他單元格為空。目標是用 1 ~9 的數位填充空單元格,每個單元格一個數位,這樣在每行、每列和每個被標記為 3*3 的子正方形內,所有 1~9 的數位都會出現。編寫一個程式來解決給定的數獨任務。
1.輸入
對於每個測試用例,後面都跟 9 行,對於表的行。在每行上都給出 9 個十進位制數位,對於這一行中的單元格。如果單元格為空,則用 0 表示。
2.輸出
對於每個測試用例,程式都應該與輸入資料相同的格式列印解決方案。空單元格必須按照規則填充。如果解決方案不是唯一,那麼程式可以列印其中任何一個。
1.輸入樣例
1
103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107
2.輸出樣例
143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127
該問題為數獨遊戲,為典型的九空格問題,可以採用回溯法搜尋。把一個 9 行 9 列的網格再細分為 9 個 3*3 的子網格,要求在每行、每列、每個子網格內都使用一次 1~9 的一個數位,即在每行、每列、每個子網格內都不允許出現相同的數位。
0 表示空白位置,其他均為已填入的數位。要求填完九空格並輸出(如果有多種結果,則只需出其中一種)。如果給定的九宮格無法按照要求填出來,則輸出原來所輸入的未填的九宮格。
用 3 個陣列標記每行、每列、每個子網格已用的數位。
row[i][x]:用於標記第 i 行中的數位 x 是否出現。
row[j][y]:用於標記第 j 列中的數位 y 是否出現。
grid[k][z]:標記第 k 個 3*3 子網格中的數位 z 是否出現。
row 和 col 的標記比較好處理。行 i、列 j 對應的子網格編號 k=3((i-1)/3)+(j-1)/3+1,如下圖所示。
1.預處理輸入資料。
2.從左上角(1,1)開始按行搜尋,如果行 i=10,則說明找到答案,返回 1。
3.如果 map[i][j] 已填數位,則判斷如果 列 j=9,則說明處理到當前行的最後一列,繼續下一行第 1 列的搜尋,即 dfs(i+1,1),否則在當前行的下一列搜尋 dfs(i,j+1)。如果搜尋成功,則返回1,否則返回 0。
4.如果 map[i][j] 未填數位,則計算當前位置(i,j)所屬的子網格 k=3((i-1)/3)+(j-1)/3+1。列舉數位 1~9 填空,如果當前行、當前列、當前子網均未填寫數位,則填寫該數位並標記該數位已出現。如果判斷列 j =9,則說明處理到當前行的最後一列,繼續下一行第 1 列的搜尋,即 dfs(i+1,1),否則在當前行的下一列搜尋,即 dfs(i,j+1)。如果搜尋失敗,否則返回 1。
package com.platform.modules.alg.alglib.poj2676; public class Poj2676 { public String output = ""; int map[][] = new int[10][10]; // row[i][x] 標記在第 i 行中數位 x 是否已出現 boolean row[][] = new boolean[10][10]; // col[j][y] 標記在第 j 列中數位 y 是否已出現 boolean col[][] = new boolean[10][10]; // grid[k][z] 標記在第 k 個 3*3 子格中數位z是否已出現 boolean grid[][] = new boolean[10][10]; boolean dfs(int i, int j) { if (i == 10) return true; boolean flag; if (map[i][j] > 0) { if (j == 9) flag = dfs(i + 1, 1); else flag = dfs(i, j + 1); return flag ? true : false; } else { int k = 3 * ((i - 1) / 3) + (j - 1) / 3 + 1; for (int x = 1; x <= 9; x++) {//列舉數位1~9填空 if (!row[i][x] && !col[j][x] && !grid[k][x]) { map[i][j] = x; row[i][x] = true; col[j][x] = true; grid[k][x] = true; if (j == 9) flag = dfs(i + 1, 1); else flag = dfs(i, j + 1); if (!flag) { //回溯,繼續列舉 map[i][j] = 0; row[i][x] = false; col[j][x] = false; grid[k][x] = false; } else return true; } } } return false; } public String cal(String input) { String[] line = input.split("n"); char ch; for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { ch = line[i-1].charAt(j-1); map[i][j] = ch - '0'; if (map[i][j] > 0) { int k = 3 * ((i - 1) / 3) + (j - 1) / 3 + 1; row[i][map[i][j]] = true; col[j][map[i][j]] = true; grid[k][map[i][j]] = true; } } } dfs(1, 1); for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) output += map[i][j]; output += "n"; } return output; } }
到此這篇關於Java利用深度搜尋解決數獨遊戲詳解的文章就介紹到這了,更多相關Java數獨遊戲內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45