Java实现蓝桥杯数独游戏的示例代码

网友投稿 260 2022-12-14


Java实现蓝桥杯数独游戏的示例代码

你一定听说过“数独”游戏。

如图,玩家需要根据99盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。

数独的答案都是唯一的,所以,多个解也称为无解。

本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。

本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。

格式要求:

输入9行,每行9个数字,0代表未知,其它数字为已知。

输出9行,每行9个数字表示数独的解。

例如:

输入(即图中题目):

005300000

800000020

070010500

400005300

010070006

003200080

060500009

004000030

000009700

程序应该输出:

145327698

839654127

672918543

496185372

218473956

753296481

367542819

984761235

521839764

再例如,输入:

800000000

003600000

070090200

050007000

000045700

000100030

001000068

008500010

090000400

程序应该输出:

812753649

943682175

675491283

154237896

369845721

287169534

521974368

438526917

7http://96318452

资源约定:

峰值内存消耗 < 256M

CPU消耗 < 2000ms

package com.company;

import java.util.Scanner;

public class 数独 {

static int qipan[][]=new int[9][9];

public static void main(String[] args) {

Scanner scanner=new Scanner(System.in);

//棋盘输入

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';

}

}

//起始--向棋盘中填入数字

f(0, 0);

}

//向第row行line列填入数字

public static void f(int row,int line)

{

if(row==9) //当数字填满时打印输出

{

print();

return; //打印后退出程序

}

if(qipan[row][line]==0) //当前单元格中没有数字

{

for(int value=1;value<10;value++)

{

if(checkg(row, line, value)!=0&&checkrl(row, line, value)!=0) //分别进行行列检测和宫内检测

{

qipan[row][line]=value; //通过检测,将数字i填入单元格

//输入下一个空格数字

if(line<8) f(row, line+1);

else if(row<9&&line==8) f(row+1, 0);

//回溯 该点填入的数字错误 进行重置并尝试下一个未重复数字

qipan[row][line]=0;

}

}

}else //当前单元格中有数字,寻找下一单元格

{

if(line<8) f(row, line+1);

else if(row<9&&line==8) f(row+1, 0);

}

}

//宫内检测

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

{

for(int j=line;j

{

// System.out.println(i+" "+j);

if(qipan[i][j]==value) //有重复数字

{

return 0;

}

}

}

return 1; //无重复数字

}

//行列检测

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) //行或列中有重复的数字

return 0;

}

return 1;

}

//打印

pAZNlmQublic 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();

}

}

}

{

for(int j=line;j

{

// System.out.println(i+" "+j);

if(qipan[i][j]==value) //有重复数字

{

return 0;

}

}

}

return 1; //无重复数字

}

//行列检测

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) //行或列中有重复的数字

return 0;

}

return 1;

}

//打印

pAZNlmQublic 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();

}

}

}

{

// System.out.println(i+" "+j);

if(qipan[i][j]==value) //有重复数字

{

return 0;

}

}

}

return 1; //无重复数字

}

//行列检测

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) //行或列中有重复的数字

return 0;

}

return 1;

}

//打印

pAZNlmQublic 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();

}

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java实现计算器功能
下一篇:Spring Boot Admin(监控工具)的使用
相关文章

 发表评论

暂时没有评论,来抢沙发吧~