zoukankan      html  css  js  c++  java
  • java实现第三届蓝桥杯方块填数

    方块填数

    “数独”是当下炙手可热的智力游戏。一般认为它的起源是“拉丁方块”,是大数学家欧拉于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("
    ");
                }
                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);
        }
    }
    
  • 相关阅读:
    隐藏 MOSS 2007 页面版本工具栏
    用于显示原始XML形式的搜索结果的XSLT
    MOSS 2007 日志设置
    在布局页面“文章页面中”添加,自定义UserControl
    MOSS 2007 最简单的自定义搜索框 SearchBox
    Asp.net常用状态管理方案分析
    提高asp.net的性能的几种方法(转)
    VS2005下如何用预编译命令来发布站点
    asp.net控件设计时支持(1)
    解决Enterprise Library January 2006不能加密配置文件的方法(转)
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12947365.html
Copyright © 2011-2022 走看看