蓝桥杯历届试题 剪格子

蓝桥杯历届试题 剪格子

题目链接

思路:dfs。

吐槽一句蓝桥杯的测试用例真是水,还不如自己出的数据严。
以下也不是完全正确的代码,只是能过蓝桥杯的样例。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 15;
int m,n;
int mp[maxn][maxn],vis[maxn][maxn];
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1}; 
int tmp,cnt,ans;
bool flag;

void dfs(int x, int y, int sum)
{
	if(x == 0 && y == 0)
		flag = true;
	if(sum == tmp && flag)
	{
		ans = min(cnt,ans);
		return;
	}
	for(int i=0;i<4;i++)
	{
		int nx = x + dx[i];
		int ny = y + dy[i];
		if(nx >= 0 && nx < n && ny >= 0 && ny < m)
		{
			if(!vis[nx][ny] && mp[nx][ny] + sum <= tmp)
			{
				vis[nx][ny] = 1;
				cnt++;
				dfs(nx,ny,mp[nx][ny]+sum);
				if(nx==0 && ny==0)
					flag = false;
				cnt--;
				vis[nx][ny] = 0;
			}
		}
	}
}

int main()
{
	while(~scanf("%d%d",&m,&n))
	{
		int sum = 0;
		int max_num = 0; 
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++)
			{
				scanf("%d",&mp[i][j]);
				max_num = max(max_num,mp[i][j]);
				sum += mp[i][j];
			}
		if(sum & 1 && max_num > sum/2)
			puts("0");
		else
		{
			tmp = sum/2;
			int ans_true = INF;
			for(int i=0;i<n;i++)
				for(int j=0;j<m;j++)
				{
					memset(vis,0,sizeof(vis));
					flag = false;
					vis[i][j] = 1;
					ans = INF;
					cnt = 1;
					dfs(i,j,mp[i][j]);
					ans_true = min(ans,ans_true);
				}
			
			printf("%d\n",ans_true);
		}
	}
	return 0;
 } 

posted on   13070046孙宇辰  阅读(236)  评论(0编辑  收藏  举报

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

导航

点击右上角即可分享
微信分享提示