rt 脑抽了死活挑不出问题
#include <bits/stdc++.h>
#define inf 2147483647
using namespace std;
const int N=15;
int tot,u,maxn=-inf;
int g[N][N],ans[N<<4];
bool f[N][N][N];
struct node {
int num,h;
}r[N<<2];
struct point {
int dx,dy;
}s[N<<2];
bool cmp (node a,node b) {
return a.num<b.num;
}
void Fillin (int x,int y,int v) {
g[x][y]=v;
for (register int i=1;i<=9;i++) {
f[x][i][v]=1;
f[i][y][v]=1;
f[x][y][i]=1;
}
int row=(x-1)/3*3+1,col=(y-1)/3*3+1;
for (register int i=row;i<=row+2;i++) {
for (register int j=col;j<=col+2;j++) {
f[i][j][v]=1;
}
}
}
void Del (int x,int y,int v) {
g[x][y]=0;
for (register int i=1;i<=9;i++) {
f[x][i][v]=0;
f[i][y][v]=0;
f[x][y][i]=0;
}
int row=(x-1)/3*3+1,col=(y-1)/3*3+1;
for (register int i=row;i<=row+2;i++) {
for (register int j=col;j<=col+2;j++) {
f[i][j][v]=0;
}
}
}
int FindScore () {
int scr=0;
for (register int i=1;i<=9;i++) {
for (register int j=1;j<=9;j++) {
scr+=g[i][j]*6;
}
}
for (register int i=2;i<=8;i++) {
for (register int j=2;j<=8;j++) {
scr+=g[i][j];
}
}
for (register int i=3;i<=7;i++) {
for (register int j=3;j<=7;j++) {
scr+=g[i][j];
}
}
for (register int i=4;i<=6;i++) {
for (register int j=4;j<=6;j++) {
scr+=g[i][j];
}
}
scr+=g[5][5];
return scr;
}
void dfs (int p) {
if (p==u) {
if (FindScore()>maxn) maxn=FindScore();
return;
}
for (register int i=1;i<=9;i++) {
if (!f[s[p].dx][s[p].dy][i]) {
Fillin(s[p].dx,s[p].dy,i);
dfs(p+1);
Del(s[p].dx,s[p].dy,i);
}
}
return;
}
int main () {
memset(f,0,sizeof(f));
for (register int i=1;i<=9;i++) {
r[i].h=i;
for (register int j=1;j<=9;j++) {
scanf("%d",&g[i][j]);
if (g[i][j]) {
Fillin(i,j,g[i][j]);
}
if (!g[i][j]) {
r[i].num++;
}
}
}
sort(r+1,r+10,cmp);
for (register int i=1;i<=9;i++) {
for (register int j=1;j<=9;j++) {
if (!g[r[i].h][j]) {
s[++u].dx=r[i].h;
s[u].dy=j;
}
}
}
dfs(1);
printf("%d\n",maxn);
return 0;
}