在 acwing 上调试也显示 Segmentation Fault
#include <bits/stdc++.h>
#define re register int
#define max(x, y) (x > y ? x : y)
using namespace std;
const int N = 9, maxN = 10;
int ans;
int row[maxN], col[maxN], cel[N][N];
int num[1 << maxN], idx[1 << maxN];
char s[maxN * maxN];
bool row_vis[maxN][maxN], col_vis[maxN][maxN], cel_vis[maxN * maxN][maxN];
inline void insert()
{
for (re i = 1; i <= N; i ++)
for (re j = 1; j <= N; j ++)
{
int k = (i - 1) * N + j;
cin >> s[k];
if (j == N) continue;
cin.get();
}
}
inline int lowbit(int x)
{
return x & (-x);
}
inline void init()
{
for (re i = 0; i <= N; i ++) idx[1 << i] = i + 1;
for (re i = 1; i <= (1 << N); i ++)
{
int cnt = 0;
for (re j = i; j; j -= lowbit(j)) cnt ++;
num[i] = cnt;
}
for (re i = 1; i <= N; i ++) row[i] = col[i] = (1 << N) - 1;
for (re i = 1; i <= 3; i ++)
for (re j = 1; j <= 3; j ++)
cel[i][j] = (1 << N) - 1;
}
inline int Round(int x, int y)
{
if (x == 1 || x == 9) return 6;
else if (x == 2 || x == 8)
{
if (y == 1 || y == 9) return 6;
else return 7;
}
else if (x == 3 || x == 7)
{
if (y == 1 || y == 9) return 6;
else if (y == 2 || y == 8) return 7;
else return 8;
}
else if (x == 4 || x == 6)
{
if (y == 1 || y == 9) return 6;
else if (y == 2 || y == 8) return 7;
else if (y == 3 || y == 7) return 8;
else return 9;
}
else
{
if (y == 1 || y == 9) return 6;
else if (y == 2 || y == 8) return 7;
else if (y == 3 || y == 7) return 8;
else if (y == 4 || y == 6) return 9;
else return 10;
}
}
inline int id(int x)
{
if (0 < x && x <= 3) return 1;
if (3 < x && x <= 6) return 2;
if (6 < x && x <= 9) return 3;
}
inline int ID(int x, int y)
{
return (x - 1) * 3 + y;
}
inline int get(int x, int y)
{
return row[x] & col[y] & cel[id(x)][id(y)];
}
inline bool check(int x, int y, int k)
{
return (row_vis[x][k] || col_vis[y][k] || cel_vis[ID(id(x), id(y))][k] ? true : false);
}
bool dfs(int n, int k)
{
if (!n)
{
ans = max(ans, k);
return true;
}
int mint = N + 1, px, py;
for (re i = 1; i <= N; i ++)
for (re j = 1; j <= N; j ++)
{
int k = (i - 1) * N + j;
if (s[k] != '0') continue;
int t = num[get(i, j)];
if (t < mint)
{
mint = t;
px = i, py = j;
}
}
for (re i = get(px, py); i; i -= lowbit(i))
{
int pos = idx[lowbit(i)];
row[px] -= 1 << (pos - 1);
col[py] -= 1 << (pos - 1);
cel[id(px)][id(py)] -= 1 << (pos - 1);
s[(px - 1) * N + py] = pos + '0';
if (dfs(n - 1, k + Round(px, py) * pos)) return true;
row[px] += 1 << (pos - 1);
col[py] += 1 << (pos - 1);
cel[id(px)][id(py)] += 1 << (pos - 1);
s[(px - 1) * N + py] = '0';
}
return false;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
insert();
init();
int cnt = 0, sum = 0;
bool flag = false;
for (re i = 1; i <= N; i ++)
for (re j = 1; j <= N; j ++)
{
int k = (i - 1) * N + j, t = s[k] - '0';
if (t == 0)
{
if (check(i, j, 1 << (t - 1)))
{
flag = true;
break;
}
row[i] -= 1 << (t - 1);
col[j] -= 1 << (t - 1);
cel[id(i)][id(j)] -= 1 << (t - 1);
row_vis[i][1 << (t - 1)] = true;
col_vis[j][1 << (t - 1)] = true;
cel[ID(id(i), id(j))][1 << (t - 1)] = true;
}
else
{
cnt ++;
sum += Round(i, j) * t;
}
}
if (flag) { cout << "-1\n"; return 0; }
dfs(cnt, sum);
cout << ans;
return 0;
}