题解 P1074 【靶形数独】
题目link
本题最难的地方
剩下的随便搜
#include<bits/stdc++.h>
using namespace std;
int a[10][10],vis[3][10][10],ans[10][10],bh[82],flag,maxn;
struct Row
{
int h,zc;
}row[10];
int cmp(Row a,Row b)
{
return a.zc<b.zc;
}
int Cast(int x,int y)
{
if(x>=1&&x<=3)
{
if(y>=1&&y<=3)
{
return 1;
}
else
{
if(y>=4&&y<=6)
{
return 2;
}
else
{
return 3;
}
}
}
if(x>=4&&x<=6)
{
if(y>=1&&y<=3)
{
return 4;
}
else
{
if(y>=4&&y<=6)
{
return 5;
}
else
{
return 6;
}
}
}
if(x>=7&&x<=9)
{
if(y>=1&&y<=3)
{
return 7;
}
else
{
if(y>=4&&y<=6)
{
return 8;
}
else
{
return 9;
}
}
}
}
int Score(int x,int y)
{
if(x==1||y==1||x==9||y==9)
{
return 6;
}
else
{
if(x==2||y==2||x==8||y==8)
{
return 7;
}
else
{
if(x==3||y==3||x==7||y==7)
{
return 8;
}
else
{
if(x==4||y==4||x==6||y==6)
{
return 9;
}
else
{
return 10;
}
}
}
}
}
int calc()
{
int sum=0;
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
sum+=ans[i][j]*Score(i,j);
}
}
return sum;
}
void dfs(int xh)
{
if(xh==82)
{
flag=1;
maxn=max(maxn,calc());
return ;
}
int x=bh[xh]/9+1;
int y=bh[xh]%9;
if(y==0)
{
x=bh[xh]/9;
y=9;
}
if(!a[x][y])
{
for(int j=1;j<=9;j++)
{
int g=Cast(x,y);
if(!vis[0][x][j]&&!vis[1][y][j]&&!vis[2][g][j])
{
ans[x][y]=j;
vis[0][x][j]=1;
vis[1][y][j]=1;
vis[2][g][j]=1;
dfs(xh+1);
vis[0][x][j]=0;
vis[1][y][j]=0;
vis[2][g][j]=0;
}
}
}
else
{
dfs(xh+1);
}
}
int main()
{
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
cin>>a[i][j];
if(a[i][j]==0)
{
row[i].zc++;
}
else
{
int v=a[i][j];
int g=Cast(i,j);
ans[i][j]=v;
vis[0][i][v]=1;
vis[1][j][v]=1;
vis[2][g][v]=1;
}
}
row[i].h=i;
}
sort(row+1,row+1+9,cmp);
int num=0;
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
int x=row[i].h,y=j;
num++;
bh[num]=(x-1)*9+y;
}
}
dfs(1);
if(flag)
{
cout<<maxn<<endl;
}
else
{
cout<<-1<<endl;
}
}