#include <bits/stdc++.h>
using namespace std;
struct Node{
int x,y,lin,lis;
};
vector <Node> v;
int a[10][10],n,ans = -1;
bool lne[10][10],lst[10][10],nin[10][10];
bool cmp(Node x,Node y){
if(x.lin == y.lin && x.x == y.x){
return x.lis > y.lis;
}
if(x.lin == y.lin){
return x.x > y.x;
}
return x.lin > y.lin;
}
int score(){
int s = 0,x;
for(int i = 1;i <= 9;i++){
for(int j = 1;j <= 9;j++){
if(i == 1 || i == 9 || j == 1 || j == 9){
x = 6;
}else if(i == 2 || i == 8 || j == 2 || j == 8){
x = 7;
}else if(i == 3 || i == 7 || j == 3 || j == 7){
x = 8;
}else if(i == 4 || i == 6 || j == 4 || j == 6){
x = 9;
}else{
x = 10;
}
s += x * a[i][j];
}
}
for(int i = 1;i <= 9;i++){
for(int j = 1;j <= 9;j++){
cout << a[i][j] << " ";
}
cout << endl;
}
cout << endl;
return s;
}
void dfs(int p,int d){
if(d == n){
ans = max(ans,score());
return;
}
for(int i = 1;i <= 9;i++){
int nine = ((v[p].x - 1) / 3 * 3 + (v[p].y - 1) / 3 + 1);
if(lne[v[p].x][i] || lst[v[p].y][i] || nin[nine][i]){
continue;
}
lne[v[p].x][i] = lst[v[p].y][i] = nin[nine][i] = true;
a[v[p].x][v[p].y] = i;
dfs(p + 1,d + 1);
a[v[p].x][v[p].y] = 0;
lne[v[p].x][i] = lst[v[p].y][i] = nin[nine][i] = false;
}
}
int main(){
for(int i = 1;i <= 9;i++){
for(int j = 1;j <= 9;j++){
cin >> a[i][j];
if(a[i][j]){
lne[i][a[i][j]] = true;
lst[j][a[i][j]] = true;
nin[(i - 1) / 3 * 3 + (j - 1) / 3 + 1][a[i][j]] = 1;
}else{
n++;
}
}
}
// for(int i = 1;i <= 9;i++){
// for(int j = 1;j <= 9;j++){
// cout << nin[i][j] << " ";
// }
// cout << endl;
// }
for(int i = 1;i <= 9;i++){
for(int j = 1;j <= 9;j++){
int h = 0,l = 0;
if(!a[i][j]){
for(int k = 1;k <= 9;k++){
if(lne[i][k]){
h++;
}
}
for(int k = 1;k <= 9;k++){
if(lst[j][k]){
l++;
}
}
v.push_back({i,j,h,l});
}
}
}
sort(v.begin(),v.end(),cmp);
// for(int i = 0;i < v.size();i++){
// cout << v[i].x <<" " << v[i].y <<" " << v[i].lin << " " << v[i].lis << endl;
// }
dfs(1,1);
cout << ans;
return 0;
}
样例1的第9行第3列那个0应该是6,是6就对了,反正每个都差一点。