简单搜索求助
  • 板块学术版
  • 楼主Qin_windlight
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/10 20:54
  • 上次更新2024/11/11 07:53:18
查看原帖
简单搜索求助
1490511
Qin_windlight楼主2024/11/10 20:54
// Problem: 
//     P1123 取数游戏
//   
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1123
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>

using namespace std;

const int N = 50;

int dx[] = {2, 2, 2, 2, 2, 1, 0, -1, -2, -2, -2, -2, -2, -2, 0, 1};
int dy[] = {-2, -1, 0, 1, 2, 2, 2, 2, 2, 1, 0, -1, -2, -2, -2, -2};
int vis[N][N];

void work() {
	int n, m, maxn = -1;
	int a[N][N];
	
	memset(vis, 0, sizeof vis);
	
	cin >> n >> m;
	
	for (int i=1;i<=n;i++) {
		for (int j=1;j<=m;j++) {
			cin >> a[i][j];
		}
	}
	
	for (int i=1;i<=n+1;i++) {
		for (int j=1;j<=m+1;j++) {
			
			if (vis[i][j] == 0) {
				int cnt = 0;
				queue <pair<int, int> > q;
				q.push({i, j});
				vis[i][j] = 1;
				
				while (q.size()) {
					pair<int, int> u = q.front();
					q.pop();
					
					for (int k=0;k<16;k++) {
						int nx = u.first + dx[k];
						int ny = u.second + dy[k];
						
						if (nx<=0||ny<=0||nx>n+3||ny>m+3) continue;
						if (vis[nx][ny] == 0) {
							vis[nx][ny] = 1;
							cnt+=a[nx][ny];
							q.push({nx, ny});
						}
					}
					
					
				}
				
				maxn = max(maxn, cnt);
			}
		}
	}
	
	cout << maxn << endl;
	
}

int main () {
	int t;
	cin >> t;
	while (t--) {
		work();
	}
	
	
	
	return 0;
}

https://www.luogu.com.cn/problem/P1123

2024/11/10 20:54
加载中...