POJ 2676/2918 数独(dfs)

思路:记录每行每列每一个宫已经出现的数字就可以。数据比較弱

另外POJ 3074 3076 必须用剪枝策略。但实现较麻烦,还是以后学了DLX再来做吧

//Accepted	160K	0MS
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N =15;
char sudo[N][N];
bool visr[N][N],visc[N][N],visg[N][N];
int pos[N][N];
bool flag;
void print()
{
    for(int i=1;i<=9;i++)
        printf("%s\n",sudo[i]+1);
}
void dfs(int x,int y)
{
    if(y==10)
    {
        dfs(x+1,1);
        return ;
    }
    if(x==10)
    {
        print();
        flag=1;
        return ;
    }
    if(sudo[x][y]!='0')
    {
        dfs(x,y+1);
        return ;
    }
    for(int i=1;i<=9&&!flag;i++)
    {
        if(visr[x][i]==0&&visc[y][i]==0&&visg[pos[x][y]][i]==0)
        {
            sudo[x][y]='0'+i;
            visc[y][i]=visr[x][i]=visg[pos[x][y]][i]=1;
            dfs(x,y+1);
            sudo[x][y]='0';
            visc[y][i]=visr[x][i]=visg[pos[x][y]][i]=0;
        }
    }
}
void ini()
{
    flag = false ;
    memset(visr,0,sizeof(visr));
    memset(visc,0,sizeof(visc));
    memset(visg,0,sizeof(visg));
}
int main()
{
    for(int i=1;i<=9;i++)
        for(int j=1;j<=9;j++)
            pos[i][j]=((j-1)/3+1)+3*((i-1)/3);

    int T;
    scanf("%d",&T);
    for(int cas=1;cas<=T;cas++)
    {
        printf("Scenario #%d:\n",cas);
        ini();
        for(int i=1;i<=9;i++)
            scanf("%s",sudo[i]+1);
        for(int i=1;i<=9;i++)
        for(int j=1;j<=9;j++)
        {
            int val=sudo[i][j]-'0';
            visr[i][val]=true;
            visc[j][val]=true;
            visg[pos[i][j]][val]=true;
        }
        dfs(1,1);
        puts("");
    }
    return 0;
}
时间: 2024-10-03 14:02:07

POJ 2676/2918 数独(dfs)的相关文章

POJ 2676 Sudoku (数独 DFS)

Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14368   Accepted: 7102   Special Judge Description Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smaller squares 3x3 as shown on the Figure. In some

POJ 2676 Sudoku (数独)

经典搜索问题,主要是时间上的优化,我用了三个辅助数组记录信息 row[i][k] = 1表示第i行数字k已经被使用,col[j][k] = 1表第j列数字k已经被使用,blo[i][k]表示第i个小九宫格中数字k已经被使用 还有很重要的一个优化(没有优化的话可能会超时,或者非常慢,像POJ讨论区里有很多说正着搜超时,倒着搜0ms,这的确是一个可以用的方法,但是有一定的随机性),每次填数字时,先扫描一遍整个矩阵,找出可选数字情况最少的那个0所在的地方,优先填这里,这样会使得搜索树尽可能的"瘦&qu

poj 2676 Sudoku (dfs)

链接:poj 2676 题意:给定一个未完成的数独,0是待填位置,其他均为已填入的数字.如果能将其 补充完整,则输出补充完整的数独(有多组答案输出任意一组),否则原样输出 数独:一个9行9列的网格,包括9个3*3的子网格,要求每行.每列.每个子网格内 都只能使用一次1-9中的一个数字, 即每行.每列.每个子网格内都不允许出现相同的数字. 分析:对于每一个未填的格,依次判断它所在行.列.子网格是否填了1-9, 若都未填,先填上该值,继续搜索, 若无法填写了,再回溯,填上其他可能的值,继续搜索 看别

ACM : POJ 2676 SudoKu DFS - 数独

SudoKu Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu POJ 2676 Description Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smaller squares 3x3 as shown on the Figure. In some of the c

poj Sudoku(数独) DFS

Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13665   Accepted: 6767   Special Judge Description Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smaller squares 3x3 as shown on the Figure.

POJ 2676 Sudoku (搜索,Dancing Links)

题目: http://poj.org/problem?id=2676 题意: 数独,每行1-9,每列1-9,每3*3小格1-9,填数,不能重复 方法:Dancing Links(16ms)或者DFS暴搜(400-900ms) Dancing Links(DLX) 是为了解决矩阵精确覆盖问题的算法,算法效率非常高 使用DLX解决的问题必须转化为矩阵精确覆盖问题: 1.DLX详解: http://wenku.baidu.com/view/d8f13dc45fbfc77da269b126.html 2

POJ 2676 数码问题DLX

Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13023   Accepted: 6455   Special Judge Description Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smaller squares 3x3 as shown on the Figure.

(搜索) poj 2676

M - Sudoku Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2676 Description Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smaller squares 3x3 as shown on

poj 2676 如何填满九宫格

Sudoku Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main Special Judge [Submit] [Status] [Discuss] Description Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to