蒟蒻位运算差,调了一个晚上没出,求助神犇(悬关)
查看原帖
蒟蒻位运算差,调了一个晚上没出,求助神犇(悬关)
950799
Chiesl楼主2023/10/24 00:44

蒟蒻虽然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;
}
2023/10/24 00:44
加载中...