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 }
    
    
    
     
  • 相关阅读:
    javaScript第一篇
    数据结构与算法学习笔记2018-01-30
    各种编程技术文章收集链接
    git最简单直接粗爆与github教程
    Word2Vec原理之Negative Sample
    Word2Vec原理之层次Softmax算法
    统计语言模型
    各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)
    TensorBoard:可视化学习
    Batch Normalization
  • 原文地址:https://www.cnblogs.com/bendandedaima/p/9449340.html
Copyright © 2011-2022 走看看