问题 1432: [蓝桥杯][历届试题]剪格子

本文介绍了一种使用深度优先搜索(DFS)算法解决特定矩阵划分问题的方法。该问题要求将一个包含数值的矩阵划分为两个部分,使得两部分的元素之和相等。通过从矩阵的第一个格子开始进行深度优先搜索,寻找可能的划分方案,并记录最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击打开链接查看题目

从第一个格子开始进行深搜,则搜到认为是划分在一起的,未搜到认为是另一部分。

#include <iostream>
#include <stdio.h> 
#include <algorithm> 
#include <string.h> 
#include <stdlib.h> 

using namespace std;
 
int row,col,ans,half;
int Map[15][15];
int vis[15][15];
int dir[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
void dfs(int x,int y,int sum,int depth) {
	//当前和为一半,看是否可以更新答案。 
	if(sum == half) {
		ans = min(ans,depth);
		return;
	}
	//减枝 
	if(sum>half || depth>=ans) return;
	for(int i = 0; i < 4; i++){
		int dx = x + dir[i][0];
		int dy = y + dir[i][1];
		if(dx>=0&&dx<row&&dy>=0&&dy<col&&vis[dx][dy]==0) {
			vis[dx][dy] = 1;
			dfs(dx,dy,sum+Map[dx][dy],depth+1);
			vis[dx][dy] = 0;
		}
	}
}

int main() {
	while(~scanf("%d%d",&col,&row)) {
		int sum = 0; 
		for(int i = 0; i < row; i++) {
			for(int j = 0; j < col; j++) {
				scanf("%d",&Map[i][j]);
				sum += Map[i][j];
			}
		}
		//题目给出数据无法平分。 
		if(sum%2) {
			printf("0\n");	
		}
		else {
			half = sum/2;
		    memset(vis,0,sizeof(vis));
		    ans = row*col;
		    vis[0][0] = 1;
		    dfs(0,0,Map[0][0],1);
		    printf("%d\n",ans);
		}
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值