蒟蒻虽然A了本题,但是用位运算来代替bool数组的却写不出来,程序中注释掉的是位运算部分,请各位神犇调一调蒟蒻位运算的代码,蒟蒻想练习位运算,悬关!
#include<bits/stdc++.h>
using namespace std;
int s[10][10] =
{
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 6, 6, 6, 6, 6, 6, 6, 6, 6},
{0, 6, 7, 7, 7, 7, 7, 7, 7, 6},
{0, 6, 7, 8, 8, 8, 8, 8, 7, 6},
{0, 6, 7, 8, 9, 9, 9, 8, 7, 6},
{0, 6, 7, 8, 9, 10,9, 8, 7, 6},
{0, 6, 7, 8, 9, 9, 9, 8, 7, 6},
{0, 6, 7, 8, 8, 8, 8, 8, 7, 6},
{0, 6, 7, 7, 7, 7, 7, 7, 7, 6},
{0, 6, 6, 6, 6, 6, 6, 6, 6, 6}
};
int a[12][12], sx[12], sy[12], maxx = -1, maxy = -1;
int cnt_x[12], cnt_y[12], cnt, g[12], ans = -1, c, nxt_x, nxt_y;
bool flagx[12][12], flagy[12][12], gr[12][12];
int tran (int x, int y) {return (x - 1) / 3 * 3 + (y - 1) / 3 + 1;}
void dfs (int x, int y, int tot, int sum) {
if (tot == 81) {
ans = max(ans, sum);
return;
}
for (int i = 0; i < 9; i++) {
// if (sx[x] & (1 << i)) continue;
// if (sy[y] & (1 << i)) continue;
// if (g[tran(x, y)] & (1 << i)) continue;
// a[x][y] = i + 1, maxx = maxy = -1;
if (flagx[x][i + 1] || flagy[y][i + 1] || gr[tran(x, y)][i + 1]) continue;
cnt_x[x]++, cnt_y[y]++;
a[x][y] = i + 1, maxx = maxy = -1;
flagx[x][i + 1] = flagy[y][i + 1] = gr[tran(x, y)][i + 1] = true;
// sx[x] |= 1 << i, sy[y] |= 1 << i, g[tran(x, y)] |= 1 << i;
for (int j = 1; j <= 9; j++) {
if (cnt_x[j] > maxx && cnt_x[j] < 9) maxx = cnt_x[j], nxt_x = j;
}
for (int j = 1; j <= 9; j++) {
if (cnt_y[j] > maxy && !a[nxt_x][j]) maxy = cnt_y[j], nxt_y = j;
}
dfs(nxt_x, nxt_y, tot + 1, sum + a[x][y] * s[x][y]);
// sx[x] -= 1 << i, sy[y] -= 1 << i, g[tran(x, y)] -= 1 << i;
flagx[x][i + 1] = flagy[y][i + 1] = gr[tran(x, y)][i + 1] = false;
cnt_x[x]--, cnt_y[y]--;
a[x][y] = 0;
}
}
int main () {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
scanf("%d", &a[i][j]);
if (a[i][j]) {
cnt++;
cnt_x[i]++, cnt_y[j]++;
flagx[i][a[i][j]] = flagy[j][a[i][j]] = true;
gr[tran(i, j)][a[i][j]] = true;
// sx[i] |= 1 << (a[i][j] - 1);
// sy[i] |= 1 << (a[i][j] - 1);
// g[tran(i, j)] |= 1 << (a[i][j] - 1);
c += a[i][j] * s[i][j];
}
}
}
int x, y;
for (int i = 1; i <= 9; i++) {
if (cnt_x[i] > maxx && cnt_x[i] < 9) maxx = cnt_x[i], x = i;
}
for (int j = 1; j <= 9; j++) {
if (cnt_y[j] > maxy && !a[x][j]) maxy = cnt_y[j], y = j;
}
dfs(x, y, cnt, c);
printf("%d", ans);
return 0;
}