藍橋杯算法題解 算法訓練 剪格子

題目描述

在這裏插入圖片描述
在這裏插入圖片描述

題解

這道題很明顯就是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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章