zoukankan      html  css  js  c++  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


    【注意】

        请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
        
        在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。

     1 #include <stdio.h>
     2 #include <string.h> 
     3 const int MS=6;
     4 int map[MS][MS];
     5 int group[MS][MS];
     6 int row[MS][MS];
     7 int col[MS][MS];
     8 int cnt=0;
     9 
    10 void solve(int cur)
    11 {
    12     if(cur>=36)
    13     {
    14         printf("%d
    ",++cnt);
    15         for(int i=0;i<6;i++)
    16         {
    17             for(int j=0;j<6;j++)
    18             {
    19                 if(j)
    20                     printf(" ");
    21                 printf("%c",map[i][j]+'A');
    22             }
    23             printf("
    ");
    24         }
    25         return ;
    26     }
    27     int r=cur/6;
    28     int c=cur%6;
    29     if(map[r][c]>=0)
    30     {
    31         solve(cur+1);
    32         return ;
    33     }
    34     for(int i=0;i<6;i++)
    35     {
    36         if(!row[r][i]&&!col[c][i])
    37         {
    38             int ok=1;
    39             for(int j=0;j<6&&ok;j++)
    40                 for(int k=0;k<6&&ok;k++)
    41                 {
    42                     if(group[j][k]==group[r][c]&&map[j][k]==i)
    43                         ok=0;
    44                 }
    45             if(ok)
    46             {
    47                 map[r][c]=i;
    48                 row[r][i]=col[c][i]=1;
    49                 solve(cur+1);
    50                 row[r][i]=col[c][i]=0;
    51                 map[r][c]=-1;
    52             }
    53         }
    54      } 
    55      return ;
    56 }
    57 
    58 int main()
    59 {
    60     memset(map,-1,sizeof(map));
    61     memset(row,0,sizeof(row));
    62     memset(col,0,sizeof(col));
    63     char str[8];
    64     for(int i=0;i<6;i++)
    65     {
    66         scanf("%s",str);
    67         for(int j=0;j<6;j++)
    68         {
    69             group[i][j]=str[j]-'0';
    70         }
    71     }
    72     int n;
    73     scanf("%d",&n);
    74     for(int i=0;i<n;i++)
    75     {
    76         scanf("%s",str);
    77         map[str[0]-'0'][str[1]-'0']=str[2]-'A';
    78         row[str[0]-'0'][str[2]-'A']=1;
    79         col[str[1]-'0'][str[2]-'A']=1;
    80     }    
    81     solve(0);
    82     if(!cnt)
    83         printf("无解
    ");
    84     return 0; 
    85 } 
  • 相关阅读:
    Trapping Rain Water
    Construct Binary Tree from Preorder and Inorder Traversal
    Flatten Binary Tree to Linked List
    Permutations II
    Unique Paths II
    Path Sum II
    Unique Binary Search Trees II
    evdev module-----uinput.py
    evdev module-----events.py
    evdev module-----device.py
  • 原文地址:https://www.cnblogs.com/767355675hutaishi/p/4295989.html
Copyright © 2011-2022 走看看