“数独”是当下炙手可热的智力游戏。一般认为它的起源是“拉丁方块”,是大数学家欧拉于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. mysql select 1
  2. 织梦多个栏目arclist调用副栏目不显示的解决办法
  3. 浅谈axios.interceptors拦截器
  4. glPushMatrix()和glPopMatrix()以及glLoadIdentity()的理解
  5. 2.jenkins 新建一个任务
  6. ORACLE系统表和视图
  7. 精通Linux Unix Shell编程电子书免费分享
  8. html制作象棋教程入门教程,canvas 纯js 绘制中国象棋棋盘
  9. JAVA微信公众号(三) 群发消息
  10. 什么是数据库防火墙 数据库防火墙作用是什么
  11. 第一次组装台式机记录
  12. 卡尔曼滤波原在温度测量中的应用
  13. jQuery学习教程
  14. 为什么CMOS门电路在传输过程存在延时
  15. 正点原子阿波罗STM32F429开发板资料发布,采用底板+核心板
  16. redis热key监控
  17. 詹姆斯·西蒙斯 - 金融业的数学大师
  18. Etcd部分常用命令+采坑
  19. keras、TensorFlow输出中间层结果的4种方法
  20. 08.09.02之叽歪

热门文章

  1. 中首清算搭配Online是配资平台吗?真相竟然是......
  2. 蠢蠢欲动,终于下手装了小新v2000bigger黑苹果
  3. IEEE Access:说我水刊?不服!
  4. 洛谷网校的课程怎么样?
  5. 智能养殖系统解决方案
  6. java 乘法_java大数加法乘法
  7. 基础复习——图形定制——图形Drawable——形状图形——九宫格图片——状态列表图形...
  8. CorelDRAW个版本软件下载,呕心集合!
  9. Oracle计算距离当前时间几天、几年、几个月的方法
  10. 知乎,你还不赶紧谢谢今日头条