HDU 1426 Sudoku Killer

本文分享了一种使用深度优先搜索(DFS)解决数独问题的实现思路与代码细节。作者通过不断调试修正,最终实现了有效的数独求解程序。文章详细介绍了如何利用三维数组进行剪枝,并确保每一步搜索的有效性。

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

数独(DFS)。


非常忧伤的一道题,先是剪枝的三个数组开成[9][9]导致 越界了WA。


然后就是每两组输出之间有空行,可是最后一组后面不能输出空行。PE好多次。


#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>

#define INF 0x7fffffff
#define eps 1e-8
#define LL long long
#define PI 3.141592654
#define CLR(a,b) memset(a,b,sizeof(a))
#define FORi(n) for(int i=0;i<n;i++)
#define FORj(n) for(int j=0;j<n;j++)
#define FORk(n) for(int k=0;k<n;k++)
#define debug puts("==fuck==")
#define acfun std::ios::sync_with_stdio(false)

#define SIZE 1000+10
using namespace std;

int g[9][9];
bool visx[9][10],visy[9][10],box[9][10];
void show()
{
    FORi(9)
    {
        FORj(8)
        printf("%d ",g[i][j]);
        printf("%d\n",g[i][8]);
    }
}
void dfs(int n)
{
    if(n>80)
        show();
    else
    {
        int i=n/9,j=n%9;
        if(!g[i][j])
        {
            for(int k=1; k<=9; k++)
                if(!visx[i][k]&&!visy[j][k]&&!box[i/3*3+j/3][k])
                {
                    g[i][j]=k;
                    visx[i][k]=visy[j][k]=box[i/3*3+j/3][k]=1;
                    dfs(n+1);
                    g[i][j]=0;
                    visx[i][k]=visy[j][k]=box[i/3*3+j/3][k]=0;
                }
        }
        else
            dfs(n+1);
    }
}
int main()
{
    char ch[5];
    bool flag=0;
    while(~scanf("%s",ch))
    {
        CLR(visx,0);
        CLR(visy,0);
        CLR(box,0);
        if(ch[0]>='1'&&ch[0]<='9')
            g[0][0]=ch[0]-'0';
        else if(ch[0]=='?')
            g[0][0]=0;
        if(g[0][0])
            visx[0][g[0][0]]=visy[0][g[0][0]]=box[0][g[0][0]]=1;
        FORi(9)
        FORj(9)
        {
            if(i==0&&j==0)continue;
            scanf("%s",ch);
            if(ch[0]>='1'&&ch[0]<='9')
                g[i][j]=ch[0]-'0';
            else if(ch[0]=='?')
                g[i][j]=0;
            if(g[i][j])
                visx[i][g[i][j]]=visy[j][g[i][j]]=box[i/3*3+j/3][g[i][j]]=1;
        }
        if(!flag)flag=1;
        else printf("\n");
        dfs(0);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值