Java實(shí)現(xiàn)藍(lán)橋杯數(shù)獨(dú)游戲的示例代碼
你一定聽(tīng)說(shuō)過(guò)“數(shù)獨(dú)”游戲。
如圖,玩家需要根據(jù)9×9盤(pán)面上的已知數(shù)字,推理出所有剩余空格的數(shù)字,并滿足每一行、每一列、每一個(gè)同色九宮內(nèi)的數(shù)字均含1-9,不重復(fù)。

數(shù)獨(dú)的答案都是唯一的,所以,多個(gè)解也稱(chēng)為無(wú)解。
本圖的數(shù)字據(jù)說(shuō)是芬蘭數(shù)學(xué)家花了3個(gè)月的時(shí)間設(shè)計(jì)出來(lái)的較難的題目。但對(duì)會(huì)使用計(jì)算機(jī)編程的你來(lái)說(shuō),恐怕易如反掌了。
本題的要求就是輸入數(shù)獨(dú)題目,程序輸出數(shù)獨(dú)的唯一解。我們保證所有已知數(shù)據(jù)的格式都是合法的,并且題目有唯一的解。
格式要求:
輸入9行,每行9個(gè)數(shù)字,0代表未知,其它數(shù)字為已知。
輸出9行,每行9個(gè)數(shù)字表示數(shù)獨(dú)的解。
例如:
輸入(即圖中題目):
005300000
800000020
070010500
400005300
010070006
003200080
060500009
004000030
000009700
程序應(yīng)該輸出:
145327698
839654127
672918543
496185372
218473956
753296481
367542819
984761235
521839764
再例如,輸入:
800000000
003600000
070090200
050007000
000045700
000100030
001000068
008500010
090000400
程序應(yīng)該輸出:
812753649
943682175
675491283
154237896
369845721
287169534
521974368
438526917
796318452
資源約定:
峰值內(nèi)存消耗 < 256M
CPU消耗 < 2000ms
package com.company;
import java.util.Scanner;
public class 數(shù)獨(dú) {
static int qipan[][]=new int[9][9];
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
//棋盤(pán)輸入
for(int i=0;i<9;i++)
{
String line=scanner.nextLine();
for(int j=0;j<9;j++)
{
qipan[i][j]=line.charAt(j)-'0';
}
}
//起始--向棋盤(pán)中填入數(shù)字
f(0, 0);
}
//向第row行l(wèi)ine列填入數(shù)字
public static void f(int row,int line)
{
if(row==9) //當(dāng)數(shù)字填滿時(shí)打印輸出
{
print();
return; //打印后退出程序
}
if(qipan[row][line]==0) //當(dāng)前單元格中沒(méi)有數(shù)字
{
for(int value=1;value<10;value++)
{
if(checkg(row, line, value)!=0&&checkrl(row, line, value)!=0) //分別進(jìn)行行列檢測(cè)和宮內(nèi)檢測(cè)
{
qipan[row][line]=value; //通過(guò)檢測(cè),將數(shù)字i填入單元格
//輸入下一個(gè)空格數(shù)字
if(line<8) f(row, line+1);
else if(row<9&&line==8) f(row+1, 0);
//回溯 該點(diǎn)填入的數(shù)字錯(cuò)誤 進(jìn)行重置并嘗試下一個(gè)未重復(fù)數(shù)字
qipan[row][line]=0;
}
}
}else //當(dāng)前單元格中有數(shù)字,尋找下一單元格
{
if(line<8) f(row, line+1);
else if(row<9&&line==8) f(row+1, 0);
}
}
//宮內(nèi)檢測(cè)
public static int checkg(int row,int line,int value)
{
if(row>=0&&row<=2) row=0;
if(row>=3&&row<=5) row=3;
if(row>=6&&row<=8) row=6;
if(line>=0&&line<=2) line=0;
if(line>=3&&line<=5) line=3;
if(line>=6&&line<=8) line=6;
for(int i=row;i<row+3;i++)
{
for(int j=line;j<line+3;j++)
{
// System.out.println(i+" "+j);
if(qipan[i][j]==value) //有重復(fù)數(shù)字
{
return 0;
}
}
}
return 1; //無(wú)重復(fù)數(shù)字
}
//行列檢測(cè)
public static int checkrl(int row,int line,int value)
{
for(int i=0;i<9;i++)
{
if(qipan[row][i]==value||qipan[i][line]==value) //行或列中有重復(fù)的數(shù)字
return 0;
}
return 1;
}
//打印
public static void print()
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
System.out.print(qipan[i][j]);
}
System.out.println();
}
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java回溯算法解數(shù)獨(dú)問(wèn)題
- python實(shí)現(xiàn)數(shù)獨(dú)游戲 java簡(jiǎn)單實(shí)現(xiàn)數(shù)獨(dú)游戲
- Java基于二維數(shù)組實(shí)現(xiàn)的數(shù)獨(dú)問(wèn)題示例
- java數(shù)獨(dú)游戲完整版分享
- java版數(shù)獨(dú)游戲界面實(shí)現(xiàn)(二)
- java版數(shù)獨(dú)游戲核心算法(一)
- 簡(jiǎn)單實(shí)現(xiàn)java數(shù)獨(dú)游戲
- Java實(shí)現(xiàn)解數(shù)獨(dú)的小程序
- java使用回溯法求解數(shù)獨(dú)示例
- Java實(shí)現(xiàn)數(shù)獨(dú)小游戲
相關(guān)文章
在Struts2中如何將父類(lèi)屬性序列化為JSON格式的解決方法
本篇文章,小編將為大家介紹關(guān)于在Struts2中如何將父類(lèi)屬性序列化為JSON格式的解決方法,有需要的朋友可以參考一下2013-04-04
Java Hutool 包工具類(lèi)推薦 ExcelUtil詳解
這篇文章主要介紹了Java Hutool 包工具類(lèi)推薦 ExcelUtil詳解,需要引入hutool包,版本號(hào)可根據(jù)實(shí)際情況更換,除hutool包之外,還需要引入操作Excel必要包,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
一文盤(pán)點(diǎn)Java創(chuàng)建實(shí)例對(duì)象的方式
Java對(duì)象是通過(guò)加載、鏈接、初始化三大步驟來(lái)完成對(duì)象的創(chuàng)建及初始化,那么接下來(lái)就說(shuō)一下Java創(chuàng)建實(shí)例對(duì)象的方式有哪幾種,文中并通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下2025-02-02
最新jsonwebtoken-jwt 0.12.3 基本使用小結(jié)
這篇文章主要介紹了最新jsonwebtoken-jwt 0.12.3 基本使用小結(jié),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-12-12
jvm中指定時(shí)區(qū)信息user.timezone問(wèn)題及解決方式
同一份程序使用時(shí)間LocalDateTime類(lèi)型,在國(guó)內(nèi)和國(guó)外部署后,返回的時(shí)間信息前端使用出問(wèn)題,這篇文章主要介紹了jvm中指定時(shí)區(qū)信息user.timezone問(wèn)題及解決方法,需要的朋友可以參考下2023-02-02
SpringBoot整合Redis實(shí)現(xiàn)緩存分頁(yè)數(shù)據(jù)查詢(xún)功能
類(lèi)似淘寶首頁(yè),這些商品是從數(shù)據(jù)庫(kù)中查出來(lái)的嗎,答案肯定不是,本文我們就通過(guò)一個(gè)案例實(shí)操一下,首頁(yè)熱點(diǎn)數(shù)據(jù)怎么放到Redis中去查詢(xún),感興趣的同學(xué)可以參考一下2023-06-06

