POJ2676 - Sudoku (深搜)

本文介绍了一种解决数独游戏的基本回溯算法。通过从第一个空格开始尝试所有可能的数字,确保每一行、每一列及每个九宫格内的数字不重复。采用倒序搜索策略,从最后一个空格开始尝试,显著提高了求解效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


题目链接

思路

题意就是让完成数独游戏。
从第一个格子开始,依次尝试各种可能。当前节点填入的数字,不能与当前行,当前列,当前九宫格中现存的数字重复。

这是最基本的思路,很容易超时,不过这道题的数据比较特别。倒着搜,也就是从最后一个节点开始尝试,会非常快,代码稍微改一下就行。

下面这个是从前面搜的,还有一道几乎一样的题,POJ - 2918

代码

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int shudo[12][12];

void input()
{
    for(int i=1; i<=9; i++)
        for(int j=1; j<=9; j++)
            scanf("%1d", shudo[i]+j);
}
void output()
{
    for(int i=1; i<=9; i++)
    {
        for(int j=1; j<=9; j++)
            printf("%d", shudo[i][j]);
        printf("\n");
    }
}
bool judge(int x, int y, int num)
{
    // 当前行列
    for(int i=1; i<=9; i++)
        if(num==shudo[x][i]) return false;
    for(int i=1; i<=9; i++)
        if(num==shudo[i][y]) return false;
    // 当前方格
    int px = x - ((x%3)?(x%3):3);
    int py = y - ((y%3)?(y%3):3);
    for(int i=1; i<=3; i++)
        for(int j=1; j<=3; j++)
            if(num==shudo[px+i][py+j]) return false;
    return true;
}
void solve(int x, int y, bool& flag)
{
    if(y>9) y -= 9, x++;
    if(x>9)
    {
        flag = true;
        return;
    }

    if(!shudo[x][y])
    {
        for(int i=1; i<=9; i++)
        {
            if(judge(x, y, i))
            {
                shudo[x][y] = i;
                solve(x, y+1, flag);
            }
            if(flag) return;
        }
        shudo[x][y] = 0;
    }
    else solve(x, y+1, flag);

}
int main()
{
    int t;
    bool flag;

    scanf("%d", &t);
    while(t--)
    {
        input();
        solve(1, 1, flag=false);
        output();
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值