HDU 1426 Sudoku Killer

本文介绍使用深度优先搜索(DFS)算法解决数独问题,包括输入输出格式处理及优化技巧。

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


http://acm.hdu.edu.cn/showproblem.php?pid=1426

题意:填数独的游戏,保证每行、每列,以及每个3x3的方格都包含1-9这九个数字。

DFS:用VIS[3][N][N]来标记,分别标记行,列和3*3的方格。
输入输出格式有点怪,输入用scanf->wrong answer,用cin ->Accepted
输出的时候注意每两组数据间有个空格,但是最后一组数据后没空格。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int Map[15][15];
struct Node
{
    int x,y;
}arr[100];
int tt;
bool vis[3][15][15];
bool flag;
int init (int i,int j)
{
    return (i-1)/3 * 3 + (j-1) / 3 + 1;
}
void dfs(int t)
{
   if(t==tt) {flag=true;return;}

   int x=arr[t].x;
   int y=arr[t].y;
   for(int i=1;i<=9;i++)
   {
       if(!vis[0][x][i] || !vis[1][y][i] || !vis[2][init(x,y)][i]) continue;
       vis[0][x][i] = vis[1][y][i]= vis[2][init(x,y)][i]=false;
       Map[x][y]=i;
       dfs(t+1);
       if(flag) return;
       vis[0][x][i] = vis[1][y][i]= vis[2][init(x,y)][i]=true;
   }
   return;
}
int main()
{
    char op;
    int cnt=0;
    while(cin>>op)
    {
        cnt++;
        memset(arr,0,sizeof(arr));
        tt=0;
        memset(vis,true,sizeof(vis));

        for(int i=1;i<=9;i++)
        for(int j=1;j<=9;j++)
        {
            if(!(i==1&&j==1)) cin>>op;
            if(op=='?') Map[i][j]=0,arr[tt++].x=i,arr[tt-1].y=j;
            else Map[i][j]=op-'0';
            vis[0][i][Map[i][j]]=vis[1][j][Map[i][j]]=vis[2][init(i,j)][Map[i][j]]=false;
        }

        flag=false;
        dfs(0);
        if(cnt>1) printf("\n");
        for(int i=1;i<=9;i++)
        for(int j=1;j<=9;j++)
        printf("%d%c",Map[i][j],j==9?'\n':' ');
    }
    return 0;
}

看似一个小小的优化,都会带来质的飞跃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值