Java实现 蓝桥杯 数独游戏
你一定听说过“数独”游戏。
如图,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含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
796318452
资源约定:
峰值内存消耗 < 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<row+3;i++)
{
for(int j=line;j<line+3;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;
}
//打印
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();
}
}
}
Java实现 蓝桥杯 数独游戏的更多相关文章
- Java实现 蓝桥杯 生命游戏
标题:生命游戏 康威生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 这个游戏在一个无限大的2D网格上进行. 初始时,每个小方格中居住着一个活着或死了的细胞. 下一时刻每个细胞的状态 ...
- 日期求星期(java)-蓝桥杯
日期求星期问题(java)-蓝桥杯 1:基姆拉尔森计算公式(计算星期) 公式: int week = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; 此处y,m,d指代年 ...
- Java实现 蓝桥杯VIP 基础练习 高精度加法
java算法 蓝桥杯 高精度加法 问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数 ...
- 蓝桥杯---数独(模拟 || dfs)
[编程题](满分33分) "数独"是当下炙手可热的智力游戏.一般认为它的起源是"拉丁方块",是大数 学家欧拉于1783年发明的. 如图[1.jpg]所示:6x6 ...
- Java实现 蓝桥杯 算法提高 进攻策略加强(暴力)
试题 算法提高 进攻策略加强 问题描述 植物大战僵尸这款游戏中,还有一个特别的玩儿法:玩家操纵僵尸进攻植物. 首先,僵尸有m种(每种僵尸都是无限多的),玩家可以选择合适的僵尸来进攻.使用第i种僵尸需要 ...
- Java实现 蓝桥杯VIP 基础练习 Sine之舞
问题描述 最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功.所以他准备和奶牛们做一个"Sine之舞"的游戏,寓教于乐,提高奶牛们的计算能力 ...
- java算法 蓝桥杯 乘法运算
问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...
- java算法 蓝桥杯 扶老奶奶街
一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中 ...
- java算法 蓝桥杯 高精度加法
问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...
随机推荐
- imos-累积和法
在解AOJ 0531 Paint Color时,学到了一个累积和的妙用--imos法,由于原文是日语,所以特意翻译过来.值得一提的是,作者Kentaro Imajo跟鄙人同龄,却已取得如此多的成就,而 ...
- AndroidStudio3.6升级后的坑-apk打包
前段时间尝试了最新版的AndroidStudio3.6,整体来说gradle调试和自带的虚拟机相比较历史版本有了更香的体验. 刚好有个新项目,就直接使用最新版了,这次新版的升级除了保持原有的界面风格, ...
- sql 取值时将字符串类型数字转化成整形
select cast(a.Vchcode as int) as avchcode,a.ptypeid,a.assqty,unit,b.pfullname,b.standard,b.type from ...
- java学习笔记之原型模式及深浅拷贝
一.原型模式的基本介绍 在聊原型模式之前,我们来思考一个小问题,传统的方式我们是如何克隆对象呢? 那我们以多利羊(Sheep)为例,来说明上述这个问题,具体代码见下面: 多利羊(Sheep) publ ...
- 使用gitlab ci构建IOS包并发送通知消息到企业微信
在之前的文章中,我们介绍了使用gitlab ci构建Android包的方法.今天我们介绍使用gitlab ci如何构建IOS包,并且在打包成功或者失败时,如何将消息通知到企业微信. 如果对gitlab ...
- 把iview中的table组件写成了一个公用组件,在另一个组件里去引用它的时候rander函数里的this指向不正确
在vue项目里使用iview制作后台管理系统时,由于有多个页面都需要用到table组件,所以就把table写到了一个公共组件里,在其他页面去引用它,但是这时会发现一个问题,就是render函数里的th ...
- 第三方动画库 Lottie嵌入记录
预览网址 https://lottiefiles.com/preview 在Podfile文件中加入 pod 'lottie-ios’ pod install 把 lottie-ios加入到项目中 ...
- 树形DP 2415HDU
Bribing FIPA Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- Oracle 中序列使用
转 https://www.cnblogs.com/21-forever/p/11265924.html 序列: 1.Oracle是不支持自增长的: ①.序列是用于生成唯一.连续序号的对象: ②.序列 ...
- 阿里短信回持.net sdk的bug导致生产服务cpu 100%排查
一:背景 1. 讲故事 去年阿里聚石塔上的所有isv短信通道全部对接阿里通信,我们就做了对接改造,使用阿里提供的.net sdk. 网址:https://help.aliyun.com/documen ...