蓝桥杯算法题解 算法训练 剪格子

题目描述

在这里插入图片描述
在这里插入图片描述

题解

这道题很明显就是dfs,从左上角开始找到tmpSum=sum/2,然后记录下最小的格子数目,最后输出即可。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <deque>
#include <list>
#include <utility>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <bitset>
#include <iterator>
using namespace std;

typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll  INF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double E = exp(1.0);
const int MOD = 1e9+7;
const int MAX = 10+5;

int m,n;
int a[MAX][MAX];
int flag[MAX][MAX];
int sum = 0;
int minNum = inf;

int dir[4][4] = {{-1,0},{1,0},{0,-1},{0,1}};

// tmp:当前遍历到的和,tmpNum:当前遍历到的数的个数
// (i,j)当前遍历到的点
void dfs(int tmp,int tmpNum,int i,int j)
{
    if(tmp == sum/2)
    {
        minNum = min(minNum,tmpNum);
        return;
    }
    for(int k = 0; k < 4; k++)
    {
        int x = i + dir[k][0];
        int y = j + dir[k][1];
        if(! (x < 0 || x >= n || y < 0 || y >= m || flag[x][y]) )
        {
            flag[x][y] = 1;
            dfs(tmp+a[x][y],tmpNum+1,x,y);
            flag[x][y] = 0;
        }
    }
}

int main()
{
    /*
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    */
    cin >> m >> n;
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
            cin >> a[i][j];
            sum += a[i][j];
        }
    }
    //memset(flag,0,sizeof(flag));
    dfs(a[0][0],1,0,0);
    cout << minNum << endl;

    return 0;
}
发布了197 篇原创文章 · 获赞 18 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_41708792/article/details/105331976
今日推荐