记录编号 |
604572 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
407.[NOIP 2009]靶形数独 |
最终得分 |
100 |
用户昵称 |
ChenBp |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.848 s |
提交时间 |
2025-08-10 16:48:29 |
内存使用 |
3.68 MiB |
显示代码纯文本
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iostream>
#define ll long long
using namespace std;
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
x = x * 10 + ch - '0', ch = getchar();
return x * f;
}
void write(int x) {
if (x < 0)
putchar('-'), x = -x;
if (x > 9)
write(x / 10);
putchar(x % 10 + '0');
return;
}
constexpr int f[9][9] = {
{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}};
int g[9][9];
int h[9], l[9], gr[3][3];
int num = 0;
struct node {
short x, y;
} s[100];
int lowbit(int x) {
return x & (-x);
}
ll ans = -1;
void dfs(ll t) {
ll now = 0;
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
now += f[i][j] * g[i][j];
ll remain = 0;
for (ll i = t; i <= num; i++) {
int x = s[i].x, y = s[i].y;
remain += f[x][y] * 9;
}
if (now + remain <= ans)
return;
if (t == num + 1) {
ans = max(ans, now);
return;
}
int min_cnt = 10, sel = -1, sel_w = 0;
for (ll i = t; i <= num; i++) {
int x = s[i].x, y = s[i].y;
int w = 0, cnt = 0;
for (int k = 1; k <= 9; k++) {
if ((((h[x] >> k) & 1) + ((l[y] >> k) & 1) + ((gr[x / 3][y / 3] >> k) & 1)) == 0) {
w |= 1 << k;
cnt++;
}
}
if (cnt == 0)
return;
if (cnt < min_cnt) {
min_cnt = cnt;
sel = i;
sel_w = w;
if (cnt == 1)
break;
}
}
swap(s[t], s[sel]);
int x = s[t].x, y = s[t].y;
int w = sel_w;
while (w) {
int k = log2(lowbit(w));
h[x] |= 1 << k;
l[y] |= 1 << k;
gr[x / 3][y / 3] |= 1 << k;
g[x][y] = k;
dfs(t + 1);
g[x][y] = 0;
h[x] &= (~(1 << k));
l[y] &= (~(1 << k));
gr[x / 3][y / 3] &= (~(1 << k));
w -= lowbit(w);
}
swap(s[t], s[sel]);
}
int main() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
g[i][j] = read();
if (g[i][j] == 0)
continue;
h[i] |= 1 << g[i][j];
l[j] |= 1 << g[i][j];
gr[i / 3][j / 3] |= 1 << g[i][j];
}
}
// for(int i=0;i<9;i++){while(h[i]){cout<<log2(bitset(h[i]))<<"
// ";h[i]-=bitset(h[i]);}cout<<endl;} for(int
// i=0;i<9;i++){while(l[i]){cout<<log2(bitset(l[i]))<<" ";l[i]-=bitset(l[i]);}cout<<endl;}
// for(int i=0;i<3;i++){for(int j=0;j<3;j++){while(gr[i][j]){cout<<log2(bitset(gr[i][j]))<<"
// ";gr[i][j]-=bitset(gr[i][j]);}cout<<endl;}}
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (g[i][j] != 0)
continue;
num++;
s[num].x = i;
s[num].y = j;
}
}
// sort(s + 1, s + 1 + num, cmp);
// for(int i=1;i<=num;i++){cout<<s[i].x<<" "<<s[i].y<<" "<<s[i].sum<<"\n";
dfs(1);
write(ans);
return 0;
}