Blue Bridge Cup training algorithm problem solution algorithm scissors grid

Title Description

Here Insert Picture Description
Here Insert Picture Description

Problem solution :

This question DFS is clear that, from the upper left corner to find tmpSum = sum / 2, then the minimum number of grid recorded, to the final output.

Code :

#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;
}
He published 197 original articles · won praise 18 · views 20000 +

Guess you like

Origin blog.csdn.net/qq_41708792/article/details/105331976