#include <cstdio>
#include <iostream>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <stack>
#define INF 0x3f3f3f3f
#define IMAX 2147483646
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int
using namespace std;
int cnt[1 << 10], num[1 << 10];
int x[9], y[9], fg[9];
int mp[10][10],fen[9][9],temp,ans;
void an(int i, int j, int k) {
x[i] ^= (1 << k);
y[j] ^= (1 << k);
fg[((i / 3) * 3) + j / 3] ^= (1 << k);
}
void dfs(int now) {
int temp;
if (now == 0) {
//cout << "dasds" << endl;
temp = 0;
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
temp += fen[i][j] * mp[i][j];
ans = max(ans, temp);
return;
}
int m = 0, ti, tj, val = 50;
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++) {
if (mp[i][j]) continue;
temp = (x[i] & y[j] & fg[((i / 3) * 3) + j / 3]);
//cout << i<<" "<<j<<" "<<temp << endl;
if (cnt[temp] < val)
m = temp, val = cnt[temp], ti = i, tj = j;
}
int tt;
while (m) {
tt = num[m & -m];
mp[ti][tj] = tt + 1;
an(ti, tj, tt);
dfs(now - 1);
mp[ti][tj] = 0;
an(ti, tj, tt);
m -= (m&-m);
}
}
int main() {
for (int i = 1; i < 1 << 9; i++)
cnt[i] = cnt[i - (i&-i)] + 1;
for (int i = 0; i < 9; i++)
num[1 << i] = i,
x[i] = y[i] = fg[i] = (1 << 9) - 1;
ans = temp = 0;
for(int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++) {
scanf("%d", &mp[i][j]);
if (mp[i][j])an(i, j, mp[i][j] - 1);
else temp++;
fen[i][j] = 10 - max(abs(i - 4), abs(j - 4));
}
dfs(temp);
printf("%d\n", ans);
return 0;
}
ch 2901
最新推荐文章于 2023-10-15 19:13:03 发布