求调为什么我这个程序跑不了?dfs + 剪枝 +二进制优化
查看原帖
求调为什么我这个程序跑不了?dfs + 剪枝 +二进制优化
1163339
Zhang_Wenjie楼主2023/12/13 13:42

在 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;
}
2023/12/13 13:42
加载中...