“数独”是当下炙手可热的智力游戏。一般认为它的起源是“拉丁方块”,是大数学家欧拉于1783年发明的。

如图[1.jpg]所示:6x6的小格被分为6个部分(图中用不同的颜色区分),每个部分含有6个小格(以下也称为分组)。开始的时候,某些小格中已经填写了字母(ABCDEF之一)。需要在所有剩下的小格中补填字母。全部填好后,必须满足如下约束:1. 所填字母只允许是A,B,C,D,E,F 中的某一个。2. 每行的6个小格中,所填写的字母不能重复。3. 每列的6个小格中,所填写的字母不能重复。4. 每个分组(参见图中不同颜色表示)包含的6个小格中,所填写的字母不能重复。为了表示上的方便,我们用下面的6阶方阵来表示图[1.jpg]对应的分组情况(组号为0~5):

022013
243333
445555

用下面的数据表示其已有字母的填写情况:

02C
03B
05A
20D
35E
53F

很明显,第一列表示行号,第二列表示列号,第三列表示填写的字母。行号、列号都从0开始计算。一种可行的填写方案(此题刚好答案唯一)为:

E F C B D A
A C E D F B
D A B E C F
F B D C A E
B D F A E C
C E A F B D

你的任务是:编写程序,对一般的拉丁方块问题求解,如果多解,要求找到所有解。

【输入、输出格式要求】

用户首先输入6行数据,表示拉丁方块的分组情况。

接着用户输入一个整数n (n<36), 表示接下来的数据行数

接着输入n行数据,每行表示一个预先填写的字母。

程序则输出所有可能的解(各个解间的顺序不重要)。
每个解占用7行。

即,先输出一个整数,表示该解的序号(从1开始),接着输出一个6x6的字母方阵,表示该解。

解的字母之间用空格分开。

如果找不到任何满足条件的解,则输出“无解”

例如:用户输入:

022013
243333
445555
02C
03B
05A
20D
35E
53F

则程序输出:

E F C B D A
A C E D F B
D A B E C F
F B D C A E
B D F A E C
C E A F B D

再如,用户输入:
002113
022443
555553
04B
05A
13D
14C
24E
50C
51A
则程序输出:
D C E F B A
E F A D C B
A B F C E D
B E D A F C
F D C B A E
C A B E D F
D C E F B A
E F A D C B
A D F B E C
B E C A F D
F B D C A E
C A B E D F
D C F E B A
A E B D C F
F D A C E B
B F E A D C
E B C F A D
C A D B F E
D C F E B A
B E A D C F
A D C F E B
F B E A D C
E F B C A D
C A D B F E
D C F E B A
E F A D C B
A B C F E D
B E D A F C
F D B C A E
C A E B D F
D C F E B A
E F A D C B
A B D F E C
B E C A F D
F D B C A E
C A E B D F
D C F E B A
E F A D C B
A D B F E C
B E C A F D
F B D C A E
C A E B D F
D C F E B A
F E A D C B
A D B C E F
B F E A D C
E B C F A D
C A D B F E
D C F E B A
F E A D C B
A F C B E D
B D E A F C
E B D C A F
C A B F D E

package com.liu.ex9;import java.util.HashSet;
import java.util.Scanner;public class Main {public static int[][] group = new int[6][6];   //输入分组情况public static char[][] result = new char[6][6];  //满足题意的填充结果public static int[][] row = new int[6][6];  //检测6行是否均为不同字母public static int[][] col = new int[6][6];  //检测6列是否均为不同字母public static int[][] set = new int[6][6];  //检测0~5组是否均为不同字母public static char[] value = {'A','B','C','D','E','F'};  //填充字母public static int count = 0;   //统计最终解个数public HashSet<String> hash = new HashSet<String>();public boolean check() {StringBuilder temp = new StringBuilder("");for(int i = 0;i < 6;i++) {for(int j = 0;j < 6;j++) temp.append(result[i][j]+" ");temp.append("\n");}String A = temp.toString();if(hash.contains(A))return false;return true;}public void dfs(int step) {if(step >= 37) {if(check()) {  //检测是否有重复解count++;System.out.println(count);StringBuilder temp = new StringBuilder("");for(int i = 0;i < 6;i++) {for(int j = 0;j < 6;j++) temp.append(result[i][j]+" ");temp.append("\n");}hash.add(temp.toString());System.out.print(temp);}return;} else {int tempRow = (step - 1) / 6;int tempCol = (step - 1) % 6;int tempSet = group[tempRow][tempCol];for(int i = 0;i < 6;i++) {if(result[tempRow][tempCol] == '-') {char temp = (char) ('A' + i);if(row[tempRow][i] == 0 && col[tempCol][i] == 0 && set[tempSet][i] == 0) {result[tempRow][tempCol] = temp;row[tempRow][i] = 1;col[tempCol][i] = 1;set[tempSet][i] = 1;dfs(step + 1);result[tempRow][tempCol] = '-';  //回溯处理row[tempRow][i] = 0;col[tempCol][i] = 0;set[tempSet][i] = 0;} else {continue;}} else {dfs(step + 1);}}}return;}public static void main(String[] args) {Main test = new Main();for(int i = 0;i < 6;i++)for(int j = 0;j < 6;j++)result[i][j] = '-';  //初始化为填充格子字符为'-'Scanner in = new Scanner(System.in);for(int i = 0;i < 6;i++) {String temp = in.nextLine();for(int j = 0;j < 6;j++)group[i][j] = temp.charAt(j) - '0';}int n = in.nextInt();in.nextLine();for(int i = 0;i < n;i++) {String temp = in.nextLine();int a = temp.charAt(0) - '0';int b = temp.charAt(1) - '0';int v = temp.charAt(2) - 'A';result[a][b] = temp.charAt(2);row[a][v] = 1;    //表示第a行位于第v个的位置,已经填充col[b][v] = 1;    //表示第b列位于第v个的位置,已经填充int tempSet = group[a][b];   //获取(a,b)小组组号set[tempSet][v] = 1;   //表示第tempSet小组第v个位置,已经填充}test.dfs(1);}
}

java实现拉丁方块填数字相关推荐

  1. 方块填数 “数独”是当下炙手可热的智力游戏。一般认为它的起源是“拉丁方块”,是大数学家欧拉于1783年发明的。 如图[1.jpg]所示:6x6的小格被分为6个部分(图中用不同的颜色区分),每个部

    /* 方块填数 "数独"是当下炙手可热的智力游戏.一般认为它的起源是"拉丁方块",是大数学家欧拉于1783年发明的. 如图[1.jpg]所示:6x6的小格被分为 ...

  2. 求圈地的方块数java,java实现第三届蓝桥杯方块填数

    方块填数 "数独"是当下炙手可热的智力游戏.一般认为它的起源是"拉丁方块",是大数学家欧拉于1783年发明的. 如图[1.jpg]所示:6x6的小格被分为6个部 ...

  3. 问题 H: 方块填数(2012年蓝桥决赛第5题--dfs)

    问题 H: 方块填数(2012年蓝桥决赛第5题) 时间限制: 1 Sec 内存限制: 128 MB [提交][状态][讨论版] 题目描述 "数独"是当下炙手可热的智力游戏.一般认为 ...

  4. java从字符串中提取数字

    1.做一下操作时会一般会用到提取数字操纵: a.列表中有翻页,当新添加的数据不是放在第一条或者最后一条时,需要翻页并循环找到对应的那条数据 b.当新添加的数据放在第一条或者最后一条时,则不需要翻页,只 ...

  5. JAVA进阶教学之(数字格式化和高精度数字)

    数字的格式化方便我们对于统计数字的时候便于区分 代码演示: new DecimalFormat("###,###.##"); package com.lbj.javase.numb ...

  6. java 蓝桥杯算法训练 数字三角形(题解)

    试题 算法训练 数字三角形 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的 ...

  7. Java基于opencv实现图像数字识别(一),java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  8. 【Java】String hashCode 这个数字 31

    1. 背景 原文:String hashCode 这个数字,很多人不知道! 生动有趣的文章:哈希表哪家强?几大编程语言吵起来了! 好文章:面试28k职位,老乡面试官从HashCode到HashMap给 ...

  9. java输出两个整数的积_如何检查Java中的两个数字相乘是否会导致溢出?

    如何检查Java中的两个数字相乘是否会导致溢出? 我想处理两个数字相乘导致溢出的特殊情况. 代码看起来像这样: int a = 20; long b = 30; // if a or b are bi ...

最新文章

  1. 直播回顾 | 关于Apollo 5.0控制在环仿真技术的分享
  2. 企业面试题库_数据库部分
  3. .NetCore从零开始使用Skywalking分布式追踪系统
  4. 如何利用期限来完成任务
  5. 商业|商务海报篇-简洁华丽的商务海报
  6. erp无线架设服务器,erp数据库架设在云服务器上
  7. 组合数学及其应用——鸽巢原理
  8. 【短时平均过零率】基于matlab语音信号短时平均过零率【含Matlab源码 1721期】
  9. c语言求信源的信息熵,第二章-信源与信息熵(三)
  10. DOS命令查看局域网所有IP
  11. 阿里巴巴矢量图库的引用以及更新
  12. AGV搬运机器人磁导航传感器D-MNSV7-X16安装方法与注意事项
  13. 3.Vue.js 实战 调查问卷WebApp项目
  14. IDEA上传项目到GitHub
  15. 深度学习介绍-深度学习是什么
  16. brpc源码学习(一)-butex
  17. Android Studio入门级UI界面设计(图文+解析)
  18. pako 压缩lottie动效资源方案
  19. 关于WORD文档的读取乱码问题
  20. c语言编程六度空间,六度空间理论的图论法证明及应用

热门文章

  1. wordpress修改了站点地址导致无法打开网站的解决办法
  2. 钢铁男子 1994.伍佰-浪人情歌
  3. 公网SSH远程连接内网Ubuntu主机【cpolar内网穿透】
  4. Android工具箱APP源码分享:“一个工具箱”
  5. php 保存tmp,tmp文件是什么
  6. Photoshop 去掉图片上的文字的几个方法
  7. RSTP 与 STP 的区别
  8. Linux平台基于socket的文件传输服务器和客户端
  9. ubuntu系统tmp文件夹内文件重启自动删除与恢复
  10. H.265/HEVC低延迟编解码FPGA IP