zoukankan      html  css  js  c++  java
  • NYOJ 722 数独(DFS)

    题目链接:722-数独


    内存限制:64MB 时间限制:1000ms 特判: No
    通过数:2 提交数:87 难度:4

    题目描述:

             数独是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个3*3宫内的数字均含1-9,不重复。 每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的。

           有一天hrdv碰到了一道号称是世界上最难的数独的题目,作为一名合格的程序员,哪能随随便便向困难低头,于是他决定编个程序来解决它。。

    输入描述:

    第一行有一个数n(0< n <100),表示有n组测试数据,每组测试数据是由一个9*9的九宫格构成,0表示对应的格子为空

    输出描述:

    输出一个9*9的九宫格,为这个数独的答案

    样例输入:

    1
    0 0 5 3 0 0 0 0 0
    8 0 0 0 0 0 0 2 0
    0 7 0 0 1 0 5 0 0
    4 0 0 0 0 5 3 0 0
    0 1 0 0 7 0 0 0 6
    0 0 3 2 0 0 0 8 0
    0 6 0 5 0 0 0 0 9
    0 0 4 0 0 0 0 3 0
    0 0 0 0 0 9 7 0 0

    样例输出:

    1 4 5 3 2 7 6 9 8 
    8 3 9 6 5 4 1 2 7 
    6 7 2 9 1 8 5 4 3 
    4 9 6 1 8 5 3 7 2 
    2 1 8 4 7 3 9 5 6 
    7 5 3 2 9 6 4 8 1 
    3 6 7 5 4 2 8 1 9 
    9 8 4 7 6 1 2 3 5 
    5 2 1 8 3 9 7 6 4 
    题意:完成数独.....满足每一行、每一列、每一个3*3宫内的数字均含1-9,不重复。
    思路:标记行的1-9个数,列的1-9的数,框框(就是题目中的宫)的1-9个数,然后暴力DFS
     1 #include<stdio.h>
     2 #include<string.h>
     3 int map[10][10];
     4 int hang[10][10];
     5 int lie[10][10];
     6 int kuang[10][10];
     7 int status;//标记是否已经遍历完 
     8 void DFS(int x,int y)
     9 {
    10     if(x==9)//因为行是0-8,所以为9的话表示整个数独已经遍历完
    11     {
    12         status=1;
    13         return;
    14     }
    15     int nx=x,ny=y+1;
    16     if(ny==9)//表明这行已经弄完,跳下一行 
    17     {
    18         ny=0;
    19         nx++;
    20     }
    21     if(map[x][y]==0)
    22     {
    23         for(int i=1;i<=9;i++)
    24         {
    25             if(hang[x][i]==0&&lie[i][y]==0&&kuang[x/3*3+y/3+1][i]==0)
    26             {
    27                 map[x][y]=i;
    28                 hang[x][i]=1;
    29                 lie[i][y]=1;
    30                 kuang[x/3*3+y/3+1][i]=1;
    31                 DFS(nx,ny);
    32                 if(status==1) return;
    33                 map[x][y]=0;//回溯 
    34                 hang[x][i]=0;//回溯 
    35                 lie[i][y]=0;//回溯 
    36                 kuang[x/3*3+y/3+1][i]=0;//回溯 
    37             }
    38         }
    39     }
    40     else DFS(nx,ny);
    41 }
    42 int main()
    43 {
    44     int T;
    45     scanf("%d",&T);
    46     while(T--)
    47     {    
    48         status=0;
    49         memset(hang,0,sizeof(hang));
    50         memset(lie,0,sizeof(lie));
    51         memset(kuang,0,sizeof(kuang));
    52         for(int i=0;i<9;i++)
    53         for(int j=0;j<9;j++)
    54         {
    55             scanf("%d",&map[i][j]);
    56             if(map[i][j]!=0)
    57             {
    58                 hang[i][map[i][j]]=1;
    59                 lie[map[i][j]][j]=1;
    60                 kuang[i/3*3+j/3+1][map[i][j]]=1;
    61             }
    62         }
    63         DFS(0,0);
    64         for(int i=0;i<9;i++)
    65         for(int j=0;j<9;j++)
    66         {
    67             if(j==8)
    68             printf("%d
    ",map[i][j]);
    69             else
    70             printf("%d ",map[i][j]);
    71         }
    72     }
    73     return 0;
    74 }
    
    
    
     
  • 相关阅读:
    November 07th, 2017 Week 45th Tuesday
    November 06th, 2017 Week 45th Monday
    November 05th, 2017 Week 45th Sunday
    November 04th, 2017 Week 44th Saturday
    November 03rd, 2017 Week 44th Friday
    Asp.net core 学习笔记 ( Area and Feature folder structure 文件结构 )
    图片方向 image orientation Exif
    Asp.net core 学习笔记 ( Router 路由 )
    Asp.net core 学习笔记 ( Configuration 配置 )
    qrcode render 二维码扫描读取
  • 原文地址:https://www.cnblogs.com/bendandedaima/p/9449340.html
Copyright © 2011-2022 走看看