BFS0pts求调!(玄关,先到先得)
查看原帖
BFS0pts求调!(玄关,先到先得)
1004336
Hope5365楼主2024/4/7 21:02

马蜂丑,请各位DALAO们见谅

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;

int t;
const int N = 10;
int n,m,a[N][N],ans;
bool v[N][N];

struct Bit
{
	int x,y,sum = 0;
	bool vis[N][N];
	void set()
	{ memset(vis,0,sizeof(vis));}
};
queue <Bit> q;

void bfs()
{
	while (!q.empty())
	{
		Bit f = q.front();
		q.pop();
		int x = f.x,y = f.y,sum = f.sum;
		for(int i = 1;i <= n;i ++)
			for(int j = 1;j <= m;j ++)
				v[i][j] = f.vis[i][j];
//		for(int i = 1;i <= n;i ++,cout << endl)
//			for(int j = 1;j <= m;j ++)
//				cout << v[i][j] << ' ';
//		cout << "x:" << x << "y:" << y << "sum:" << sum << endl;
		if (x < 1 || x > n || y < 1 || y > m || v[x][y]) continue;
		bool can = 1;
		for(int i = -1;i <= 1;i ++)
			for(int j = -1;j <= 1;j ++)
				v[i + x][j + y] = 1;
		for(int i = 1;i <= n;i ++)
			for(int j = 1;j <= m;j ++)
				if (v[i][j] == 0 && (i != x || j != y))
					can = 0;
		if (can == 1) 
		{
			ans = sum;
//			cout << "Ok" << endl;
			return ;
		}
//		if (v[x][y]) continue;
		for(int i = 1;i <= n;i ++)
			for(int j = 1;j <= m;j ++)
			{
				Bit tot;
				tot.x = i,tot.y = j,tot.sum = sum + a[i][j];
//				cout << "tot.x:" << tot.x << "tot.y:" << tot.y << "tot.sum:" << tot.sum;
				for(int _i = 1;_i <= n;_i ++)
					for(int _j = 1;_j <= m;_j ++)
						tot.vis[_i][_j] = v[_i][_j];
				q.push({tot});
//				cout << "tot.x:" << tot.x << "tot.y:" << tot.y << "tot.sum:" << tot.sum;
			}
	}
}

void func()
{
	ans = 0;
	cin >> n >> m;
	for(int i = 1;i <= n;i ++)
		for(int j = 1;j <= m;j ++)
			cin >> a[i][j];
	while (!q.empty()) q.pop();
	Bit tot;
	for(int i = 1;i <= n;i ++)
		for(int j = 1;j <= m;j ++)
			tot.vis[i][j] = 0;
	for(int i = 1;i <= n;i ++)
		for(int j = 1;j <= m;j ++)
		{
			tot.x = i,tot.y = j;
			q.push({tot});
		}
	bfs();
	cout << ans << endl;
}

int main()
{
	ios::sync_with_stdio(0);
	cin >> t;
	while (t --) func();
	return 0;
}
2024/4/7 21:02
加载中...