璟雯院

珺璟如晔,雯华若锦

用户工具

站点工具


icpc:problems:luogup1123
problems
名称取数游戏
题目编号P1123
题目链接luogu.com.cn/…
来源Luogu
算法分类搜索, DFS, 回溯
难易程度容易

取数游戏

想法

二维转一维枚举,每个点两个状态。用方向数组打标记。

代码实现

#include<cstdio>
#include<cstring>
int n, m, ans, sum;
int map[10][10];
int vis[10][10];
int x_turn[8]={-1, 0, 1, -1, 1, -1, 0, 1 };
int y_turn[8]={-1, -1, -1, 0, 0, 1, 1, 1 };
 
void DFS(int sit) {
	if(sit == n*m) {
		if(sum > ans)ans = sum;
		return ;
	}
	int x = sit/m, y = sit%m;
	if(vis[x][y] > 0) {
		DFS(sit+1);
		return ;
	}
	DFS(sit+1);
	sum += map[x][y];
	for(int i=0; i<8; i++) {
		if(x+x_turn[i] < 0 || x+x_turn[i] >= n || y+y_turn[i] < 0 || y + y_turn[i] >=m )continue;
		vis[x+x_turn[i]][y+y_turn[i]]++;
	}
	DFS(sit+1);
	sum -= map[x][y];
	for(int i=0; i<8; i++) {
		if(x+x_turn[i] < 0 || x+x_turn[i] >= n || y+y_turn[i] < 0 || y + y_turn[i] >=m )continue;
		vis[x+x_turn[i]][y+y_turn[i]]--;
	}
	return ;
}
 
int main() {
	int T;
	scanf("%d", &T);
	while(T--) {
		ans = 0; sum = 0;
		scanf("%d %d", &n, &m);
		memset(vis, 0, sizeof(vis));
		for(int i=0; i<n; i++) 
			for(int j=0; j<m; j++)
				scanf("%d", &map[i][j]);
		DFS(0);
		printf("%d\n", ans);
	}
	return 0;
}
/app/www/public/data/pages/icpc/problems/luogup1123.txt · 最后更改: 2024/01/21 11:13 由 温婕莺