最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java利用深度搜索解決數(shù)獨(dú)游戲詳解

 更新時(shí)間:2022年08月16日 10:59:25   作者:chengqiuming  
數(shù)獨(dú)是一項(xiàng)非常簡單的任務(wù)。玩家需要根據(jù)9×9盤面上的已知數(shù)字,推理出所有剩余空格的數(shù)字,并滿足每一行、每一列、每一個(gè)粗線宮(3*3)內(nèi)的數(shù)字均含1-9,不重復(fù)。本文將利用Java編寫一個(gè)程序來解決給定的數(shù)獨(dú)任務(wù),感興趣的可以動(dòng)手嘗試一下

一、問題描述

數(shù)獨(dú)是一項(xiàng)非常簡單的任務(wù)。如下圖所示,一張 9 行 9 列的表被分成 9 個(gè) 3*3 的小方格。在一些單元格中寫上十進(jìn)制數(shù)字 1~9,其他單元格為空。目標(biāo)是用 1 ~9 的數(shù)字填充空單元格,每個(gè)單元格一個(gè)數(shù)字,這樣在每行、每列和每個(gè)被標(biāo)記為 3*3 的子正方形內(nèi),所有 1~9 的數(shù)字都會(huì)出現(xiàn)。編寫一個(gè)程序來解決給定的數(shù)獨(dú)任務(wù)。

二、輸入和輸出

1.輸入

對于每個(gè)測試用例,后面都跟 9 行,對于表的行。在每行上都給出 9 個(gè)十進(jìn)制數(shù)字,對于這一行中的單元格。如果單元格為空,則用 0  表示。

2.輸出

對于每個(gè)測試用例,程序都應(yīng)該與輸入數(shù)據(jù)相同的格式打印解決方案??諉卧癖仨毎凑找?guī)則填充。如果解決方案不是唯一,那么程序可以打印其中任何一個(gè)。

三、輸入和輸出樣例

1.輸入樣例

1
103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107

2.輸出樣例

143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127

四、分析

該問題為數(shù)獨(dú)游戲,為典型的九空格問題,可以采用回溯法搜索。把一個(gè) 9 行 9 列的網(wǎng)格再細(xì)分為 9 個(gè) 3*3 的子網(wǎng)格,要求在每行、每列、每個(gè)子網(wǎng)格內(nèi)都使用一次 1~9 的一個(gè)數(shù)字,即在每行、每列、每個(gè)子網(wǎng)格內(nèi)都不允許出現(xiàn)相同的數(shù)字。

0 表示空白位置,其他均為已填入的數(shù)字。要求填完九空格并輸出(如果有多種結(jié)果,則只需出其中一種)。如果給定的九宮格無法按照要求填出來,則輸出原來所輸入的未填的九宮格。

用 3 個(gè)數(shù)組標(biāo)記每行、每列、每個(gè)子網(wǎng)格已用的數(shù)字。

row[i][x]:用于標(biāo)記第 i 行中的數(shù)字 x 是否出現(xiàn)。

row[j][y]:用于標(biāo)記第 j 列中的數(shù)字 y 是否出現(xiàn)。

grid[k][z]:標(biāo)記第 k 個(gè) 3*3 子網(wǎng)格中的數(shù)字 z 是否出現(xiàn)。

row 和 col 的標(biāo)記比較好處理。行 i、列 j 對應(yīng)的子網(wǎng)格編號(hào) k=3((i-1)/3)+(j-1)/3+1,如下圖所示。

五、算法設(shè)計(jì)

1.預(yù)處理輸入數(shù)據(jù)。

2.從左上角(1,1)開始按行搜索,如果行 i=10,則說明找到答案,返回 1。

3.如果 map[i][j] 已填數(shù)字,則判斷如果 列 j=9,則說明處理到當(dāng)前行的最后一列,繼續(xù)下一行第 1 列的搜索,即 dfs(i+1,1),否則在當(dāng)前行的下一列搜索 dfs(i,j+1)。如果搜索成功,則返回1,否則返回 0。

4.如果 map[i][j] 未填數(shù)字,則計(jì)算當(dāng)前位置(i,j)所屬的子網(wǎng)格 k=3((i-1)/3)+(j-1)/3+1。枚舉數(shù)字 1~9 填空,如果當(dāng)前行、當(dāng)前列、當(dāng)前子網(wǎng)均未填寫數(shù)字,則填寫該數(shù)字并標(biāo)記該數(shù)字已出現(xiàn)。如果判斷列 j =9,則說明處理到當(dāng)前行的最后一列,繼續(xù)下一行第 1 列的搜索,即 dfs(i+1,1),否則在當(dāng)前行的下一列搜索,即 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] 標(biāo)記在第 i 行中數(shù)字 x 是否已出現(xiàn)
    boolean row[][] = new boolean[10][10];
    // col[j][y] 標(biāo)記在第 j 列中數(shù)字 y 是否已出現(xiàn)
    boolean col[][] = new boolean[10][10];
    // grid[k][z] 標(biāo)記在第 k 個(gè) 3*3 子格中數(shù)字z是否已出現(xiàn)
    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++) {//枚舉數(shù)字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) { //回溯,繼續(xù)枚舉
                        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;
    }
}

七、測試

到此這篇關(guān)于Java利用深度搜索解決數(shù)獨(dú)游戲詳解的文章就介紹到這了,更多相關(guān)Java數(shù)獨(dú)游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java字符編碼解碼的實(shí)現(xiàn)詳解

    Java字符編碼解碼的實(shí)現(xiàn)詳解

    本篇文章介紹了,Java字符編碼解碼的實(shí)現(xiàn)詳解。需要的朋友參考下
    2013-05-05
  • SpringBoot實(shí)現(xiàn)發(fā)送驗(yàn)證碼功能(圖片驗(yàn)證碼)

    SpringBoot實(shí)現(xiàn)發(fā)送驗(yàn)證碼功能(圖片驗(yàn)證碼)

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)發(fā)送驗(yàn)證碼功能(圖片驗(yàn)證碼),本次內(nèi)容主要學(xué)習(xí)如何做一個(gè)發(fā)送驗(yàn)證碼和識(shí)別驗(yàn)證碼的功能,需要的朋友可以參考下
    2024-06-06
  • SpringCloud Hystrix熔斷器使用方法介紹

    SpringCloud Hystrix熔斷器使用方法介紹

    通過hystrix可以解決雪崩效應(yīng)問題,它提供了資源隔離、降級機(jī)制、融斷、緩存等功能。接下來通過本文給大家分享SpringCloud集成Hystrix熔斷,感興趣的朋友一起看看吧
    2023-03-03
  • spring boot開發(fā)遇到坑之spring-boot-starter-web配置文件使用教程

    spring boot開發(fā)遇到坑之spring-boot-starter-web配置文件使用教程

    Spring Boot支持容器的自動(dòng)配置,默認(rèn)是Tomcat,當(dāng)然我們也是可以進(jìn)行修改的。這篇文章給大家介紹了spring boot開發(fā)遇到坑之spring-boot-starter-web配置文件使用教程,需要的朋友參考下吧
    2018-01-01
  • Maven倉庫分類的優(yōu)先級

    Maven倉庫分類的優(yōu)先級

    本文主要介紹了Maven倉庫分類的優(yōu)先級,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java 中String StringBuilder 與 StringBuffer詳解及用法實(shí)例

    Java 中String StringBuilder 與 StringBuffer詳解及用法實(shí)例

    這篇文章主要介紹了Java 中String StringBuilder 與 StringBuffer詳解及用法實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java常用JVM參數(shù)實(shí)戰(zhàn)

    Java常用JVM參數(shù)實(shí)戰(zhàn)

    本文主要介紹了Java常用JVM參數(shù)實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Spring Boot 中application.yml與bootstrap.yml的區(qū)別

    Spring Boot 中application.yml與bootstrap.yml的區(qū)別

    其實(shí)yml和properties文件是一樣的原理,且一個(gè)項(xiàng)目上要么yml或者properties,二選一的存在。這篇文章給大家介紹了Spring Boot 中application.yml與bootstrap.yml的區(qū)別,感興趣的朋友一起看看吧
    2018-04-04
  • Spring Boot與Kotlin定時(shí)任務(wù)的示例(Scheduling Tasks)

    Spring Boot與Kotlin定時(shí)任務(wù)的示例(Scheduling Tasks)

    這篇文章主要介紹了Spring Boot與Kotlin定時(shí)任務(wù)的示例(Scheduling Tasks),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • Java的云打印Lodop

    Java的云打印Lodop

    這篇文章主要介紹了Java的云打印Lodop 的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07

最新評論

永年县| 乌拉特前旗| 樟树市| 来凤县| 大连市| 鄱阳县| 米林县| 阿勒泰市| 北流市| 青龙| 呼伦贝尔市| 济南市| 古浪县| 新河县| 通河县| 竹溪县| 双桥区| 射阳县| 普安县| 会东县| 礼泉县| 呈贡县| 宜君县| 龙胜| 嘉义县| 华亭县| 宁波市| 嘉兴市| 龙里县| 遂平县| 霍山县| 七台河市| 和林格尔县| 武宁县| 师宗县| 赞皇县| 盐边县| 云安县| 宁化县| 汉寿县| 手机|