蓝桥杯历届试题 剪格子
思路: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
",ans_true);
}
}
return 0;
}