方块填数

“数独”是当下炙手可热的智力游戏。一般认为它的起源是“拉丁方块”,是大数学家欧拉于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):

    000011

    022013

    221113

    243333

    244455

    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的字母方阵,表示该解。

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

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

例如:用户输入:

000011

022013

221113

243333

244455

445555

6

02C

03B

05A

20D

35E

53F

则程序输出:

1

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

再如,用户输入:

001111

002113

022243

022443

544433

555553

7

04B

05A

13D

14C

24E

50C

51A

则程序输出:

1

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

2

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

3

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

4

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

5

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

6

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

7

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

8

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

9

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

【注意】

请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!

在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。

请把所有函数写在同一个文件中,调试好后,拷贝到【考生文件夹】下对应题号的“解答.txt”中即可。

相关的工程文件不要拷入。

源代码中不能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。

允许使用STL类库,但不能使用MFC或ATL等非ANSI c++标准的类库。

例如,不能使用CString类型(属于MFC类库);例如,不能使用randomize, random函数(不属于ANSI C++标准)

import java.util.ArrayList;
import java.util.Scanner; public class Main {
public static int[][] map = new int[6][6];
public static char[][] value = new char[6][6];
public static int[][] group = new int[6][6];
public static int[][] ring = new int[6][6];
public static int[][] row = new int[6][6];
public static ArrayList<String> list = new ArrayList<String>(); public void init() {
for(int i = 0;i < 6;i++) {
for(int j = 0;j < 6;j++) {
value[i][j] = '-';
group[i][j] = -1;
ring[i][j] = -1;
row[i][j] = -1;
}
}
} public boolean check(int step, int i) {
int x = step / 6;
int y = step % 6;
if(group[map[x][y]][i] == -1 && ring[x][i] == -1 && row[y][i] == -1
&& value[x][y] == '-')
return true;
return false;
} public void dfs(int step) {
if(step == 36) {
StringBuilder temp = new StringBuilder("");
for(int i = 0;i < 6;i++) {
for(int j = 0;j < 6;j++) {
temp.append(value[i][j]);
if(j != 5)
temp.append(" ");
}
if(i != 5)
temp.append("\n");
}
if(!list.contains(temp.toString()))
list.add(temp.toString());
return;
} else { for(int i = 0;i < 6;i++) {
int x = step / 6;
int y = step % 6;
if(check(step, i)) {
group[map[x][y]][i] = 1;
ring[x][i] = 1;
row[y][i] = 1;
value[x][y] = (char) ('A' + i);
dfs(step + 1);
group[map[x][y]][i] = -1;
ring[x][i] = -1;
row[y][i] = -1;
value[x][y] = '-';
}
if(value[x][y] != '-')
dfs(step + 1);
}
}
} public void getResult(String[] M, String[] P) {
init();
for(int i = 0;i < M.length;i++)
for(int j = 0;j < M[i].length();j++)
map[i][j] = M[i].charAt(j) - '0';
for(int i = 0;i < P.length;i++) {
int x = P[i].charAt(0) - '0';
int y = P[i].charAt(1) - '0';
int z = P[i].charAt(2) - 'A';
ring[x][z] = 1;
row[y][z] = 1;
group[map[x][y]][z] = 1;
value[x][y] = P[i].charAt(2);
}
dfs(0);
if(list.size() == 0) {
System.out.println("无解");
return;
}
for(int i = 0;i < list.size();i++) {
System.out.println((i + 1));
System.out.println(list.get(i));
}
} public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
String[] M = new String[6];
for(int i = 0;i < 6;i++)
M[i] = in.nextLine();
int n = in.nextInt();
in.nextLine();
String[] P = new String[n];
for(int i = 0;i < n;i++)
P[i] = in.nextLine();
test.getResult(M, P);
}
}

java实现第三届蓝桥杯方块填数的更多相关文章

  1. java实现第七届蓝桥杯七星填数

    七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...

  2. java实现第六届蓝桥杯五星填数

    五星填数 如[图1.png]的五星图案节点填上数字:1~12,除去7和11. 要求每条直线上数字和相等. 如图就是恰当的填法. 请你利用计算机搜索所有可能的填法有多少种. 注意:旋转或镜像后相同的算同 ...

  3. java实现第七届蓝桥杯方格填数

    方格填数 题目描述 如下的10个格子 +--+--+--+ | | | | +--+--+--+--+ | | | | | +--+--+--+--+ | | | | +--+--+--+ (如果显示 ...

  4. 第七届 蓝桥杯 方格填数 dfs

    如下的10个格子  填入0~9的数字.要求:连续的两个数字不能相邻. (左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数. 注意:你提交的应该是一个整数,不要填写任何 ...

  5. 蓝桥杯 方格填数 DFS 全排列 next_permutation用法

    如下的10个格子(参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数.注意:你提交的应该是一个 ...

  6. 2015蓝桥杯五星填数(C++C组)

    题目:五星填数 如[图1.png]的五星图案节点填上数字:1~12,除去7和11.要求每条直线上数字和相等.如图就是恰当的填法.请你利用计算机搜索所有可能的填法有多少种.注意:旋转或镜像后相同的算同一 ...

  7. java实现第三届蓝桥杯填算式

    ** 填算式** [结果填空] (满分11分) 看这个算式: ☆☆☆ + ☆☆☆ = ☆☆☆ 如果每个五角星代表 1 ~ 9 的不同的数字. 这个算式有多少种可能的正确填写方法? 173 + 286 ...

  8. java实现第三届蓝桥杯DNA对比

    DNA对比 脱氧核糖核酸即常说的DNA,是一类带有遗传信息的生物大分子.它由4种主要的脱氧核苷酸(dAMP.dGMP.dCMT和dTMP)通过磷酸二酯键连接而成.这4种核苷酸可以分别记为:A.G.C. ...

  9. java实现第三届蓝桥杯拼音字母

    拼音字母 在很多软件中,输入拼音的首写字母就可以快速定位到某个词条.比如,在铁路售票软件中,输入: "bj"就可以定位到"北京".怎样在自己的软件中实现这个功能 ...

随机推荐

  1. Coursera课程笔记----C++程序设计----Week3

    类和对象(Week 3) 内联成员函数和重载成员函数 内联成员函数 inline + 成员函数 整个函数题出现在类定义内部 class B{ inline void func1(); //方式1 vo ...

  2. Android CodeReview 些许总结

    CodeReview些许总结 1:使用Handler的时候,使用handler.post(Runnable);,hanler与类尽量保持弱引用关系,或者使用静态的handler对象 public Ha ...

  3. (mysql)数据库笔记

    一.数据库的特点: a.实现数据共享  b.采用特定的数据类型. c.具有较高的数据独立性 d.具有统一的数据控制功能. 二.mysql的优势: a.速度:运行速度快 b.价格:mysql对多数个人来 ...

  4. webpack+vue img的src问题

    在vue中给图片添加路径试过三种方式: 1.在css的background中添加路径: 2.将路径写在data属性中,然后动态注入img标签的src属性: 3.在img标签中奖src属性写死 第三种方 ...

  5. Java基础之抽象类和接口

    今天来说说抽象类和接口的实现以及它们的区别.我们知道抽象类和接口都是对具体事物的抽象,接口在实现上比抽象类更加抽象,抽象类中可以有普通方法和变量,而接口中只有抽象方法和不可变常量.但是从另一个角度看, ...

  6. python操作excel----openpyxl模块

    openpyxl模块支持.xls和.xlsx格式的excel创建,但是只支持.xlsx格式的读取操作,不支持.xls的读取(可以使用xlrd模块来读取,写入操作也可使用xlwt模块),也可使用pand ...

  7. DPDK Mbuf Library(学习笔记)

    1 Mbuf库 Mbuf库提供了分配和释放缓冲区(mbufs)的功能,DPDK应用程序可以使用这些mbufs来存储消息缓冲. 消息缓冲存储在内存池中,使用Mempool库. 数据结构rte_mbuf通 ...

  8. MVC4.0 上传文件

    Views/Import/ImportExcel.cshtml @{ Layout = null;} <!DOCTYPE html> <html><head> &l ...

  9. 王玉兰201771010128《面象对象程序设计(Java)》第九周学习总结

    第一部分:理论基础部分总结: 一:(1)异常:在程序的执行过程中所发生的异常事件,它中断指令的正常执行. 常见的几种错误:A:用户输入错误:B:设备错误;硬件出错:C:物理限制:磁盘满了,可用存储空间 ...

  10. hibernate 异常分析:java.lang.NoClassDefFoundError: org/hibernate/Session

    原因: NoClassDefFoundError的含义就是说编译器找不到org/hibernate/Session这个类的定义 解决方法: 1.检查java中是否导入hibernate 包 impor ...