记录编号 600138 评测结果 AAAAAAAAATATAATTAAAA
题目名称 [NOIP 2009]靶形数独 最终得分 80
用户昵称 Gravatarwxs 是否通过 未通过
代码语言 C++ 运行时间 10.683 s
提交时间 2025-04-16 20:20:50 内存使用 3.30 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int n=20;
int ans=0;
int g[n][n],m=0;
int row[n][n],col[n][n],grid[5][5][n];
int score[20][20]={
	{6,6,6,6,6,6,6,6,6},
	{6,7,7,7,7,7,7,7,6},
	{6,7,8,8,8,8,8,7,6},
	{6,7,8,9,9,9,8,7,6},
	{6,7,8,9,10,9,8,7,6},
	{6,7,8,9,9,9,8,7,6},
	{6,7,8,8,8,8,8,7,6},
	{6,7,7,7,7,7,7,7,6},
	{6,6,6,6,6,6,6,6,6},
};
struct Node
{
    int x,y;
}a[1000];
bool dfs(int k,int t)
{
    if(k==m+1)
    {
        if(t<ans) return false;
        else{
            ans=t;
        }
    }
    int x=a[k].x,y=a[k].y;
    for(int num=1;num<=9;num++)
    {
        if(row[x][num]||col[y][num]||grid[x/3][y/3][num]) continue;
        g[x][y]=num;
        row[x][num]=col[y][num]=grid[x/3][y/3][num]=1;
        t+=score[x][y]*num;
        if(dfs(k+1,t)) return true;
        g[x][y]=0;
        row[x][num]=col[y][num]=grid[x/3][y/3][num]=0;
        t-=score[x][y]*num;
    }
    return false;
}
int main()
{
    freopen("sudoku.in","r",stdin);
    freopen("sudoku.out","w",stdout);
    
    m=0;
    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            char op;
            cin>>op;
            op-='0';
            g[i][j]=op;
            if(op==0) a[++m]={i,j};
            row[i][op]=col[j][op]=grid[i/3][j/3][op]=1;
        }
    }
    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++) ans+=score[i][j]*g[i][j];
    }
    int ans1=ans;
    dfs(1,ans1);
    //cout<<ans<<' '<<ans1<<endl;
    if(ans1!=ans) cout<<ans<<endl;
    else cout<<-1<<endl;
    return 0;
}