zoukankan      html  css  js  c++  java
  • POJ2676Sudoku

    http://poj.org/problem?id=2676

    题意 : 这个是我最喜欢玩的数独了,就是一个9乘9的宫格,填上1到9九个数字,每行每列每个宫格之内不能有重复的数字,给出的九宫格中,0是待填的数字,其他数字是已经填好的,若是无法按要求填出来,就输出原来的九宫格;

    思路 : DFS,深搜递归一下,设三个标记数组,标记一下每行的,每列的,每个宫格的,如果这个数字出现了,就标记了就行,我代码里写的是标记数组row[ i ][ j ],代表的是第 i 行的 j 已经出现了,col[ i ][ j ]代表的是第 i 行的 j 数组存在,map[ i ][ j ]宫格 i 的 j 这个数字存在,而宫格的话大家可以自己想一下,如果一个位置的行和列是x,y,那么他所在的九宫格就应该是3*((x-1)/3)+(y-1)/3+1,但如果你往里输入的九宫格下标是从0开始的话,这个就要变成x/3*3+y/3,我也试过,但是从0开始存一直都是错的,后来就改为从一开始存了

    #include<cstring>
    #include<cstdio>
    #include<iostream>
    using namespace std;
    int row[10][10],col[10][10],map[10][10];//行列宫格的标记数组
    int Sudoku[10][10];
    int flag ;//标记变量
    int DFS(int x,int y)
    {
        if(x == 10)
        {
            for(int i = 1 ; i <= 9 ; i++)
            {
                for(int j = 1 ; j <= 9 ; j++)
                    printf("%d",Sudoku[i][j]);
                printf("
    ");
            }
            return 1;
        }
        flag = 0 ;
        if(Sudoku[x][y])//该位置原本是有数字的
        {
            if(y == 9)
                flag = DFS(x+1,1);
            else
                flag = DFS(x,y+1);
            if(flag)
                return 1;
            else
                return 0;
        }
        else
        {
            for(int i = 1 ; i <= 9; i++)
                if(!row[x][i] && !col[y][i] && !map[3*((x-1)/3)+(y-1)/3+1][i])//如果行列宫格都没有这个数字
                {
                    Sudoku[x][y] = i;//就填上这个数字,然后下边的行列宫格都标记为已填此数字
                    row[x][i]= 1;
                    col[y][i]= 1;
                    map[3*((x-1)/3)+(y-1)/3+1][i] = 1;
                    if(y == 9)
                        flag=DFS(x+1,1);
                    else
                        flag=DFS(x,y+1);
                    if(!flag)//如果没找到合适的,就全部返回原值
                    {
                        Sudoku[x][y]=0;
                        row[x][i] = 0;
                        col[y][i]= 0;
                        map[3*((x-1)/3)+(y-1)/3+1][i]=0;
                    }
                    else
                        return 1;
                }
        }
        return 0;
    }
    void Init()
    {
        memset(row,0,sizeof(row));
        memset(col,0,sizeof(col));
        memset(map,0,sizeof(map));
    }
    int main()
    {
        int i,j,n;
        scanf("%d",&n);
        for(int s = 0 ; s < n ; s++)
        {
            Init();
            for(i = 1 ; i <= 9 ; i++)
                for(j = 1 ; j <= 9 ; j++)
                {
                    scanf("%1d",&Sudoku[i][j]);
                    if(Sudoku[i][j])
                    {
                        row[i][Sudoku[i][j]] = 1;
                        col[j][Sudoku[i][j]] = 1;
                        map[3*((i-1)/3)+(j-1)/3+1][Sudoku[i][j]] = 1 ;
                    }
                }
            DFS(1,1);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Go并发
    frida打印class的信息--java反射
    Go嵌入类型
    Go方法集-应该传值类型还是指针类型?
    springboot使用unidbg遇到logback和sl4j依赖冲突,正确配置文件
    Eureka 微服务注册发现开源框架
    呼吸机CPAP与APAP:哪个更好?
    如何看睡眠监测报告
    抓包工具 tcpdump 用法说明
    利用ROS的samba功能实现centos定期备份ROS配置
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3287432.html
Copyright © 2011-2022 走看看