蓝桥杯剪格子dfs

复制代码
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cmath>
#include<algorithm>

#include<bits/stdc++.h>
using namespace std;

int N, M; 
int num = INT_MAX, sum = 0;
int A[10][10];
bool visit[10][10];
bool outOfBorder(int i, int j)
 {
    if (i < 0 || i >= N || j < 0 || j >= M)
        return true;
    return false;
}

void DFS(int i, int j, int currentSum, int currentNum)
 {
    visit[i][j] = true;
    currentSum += A[i][j];
    ++currentNum;
    if (2 * currentSum >= sum)
     {
        if (2 * currentSum == sum)// 如果当前遍历过的数字之和等于所有数字之和的一半
            num = min(currentNum, num);// 更新包含左上角格子的那个区域包含的格子的最小数目
        visit[i][j] = false;
        return;// 回溯到上一结点
    }
    if (!outOfBorder(i, j + 1) && !visit[i][j + 1])// 向右移动
        DFS(i, j + 1, currentSum, currentNum);
        
    if (!outOfBorder(i + 1, j) && !visit[i + 1][j])// 向下移动
        DFS(i + 1, j, currentSum, currentNum);
        
    if (!outOfBorder(i, j - 1) && !visit[i][j - 1])// 向左移动
        DFS(i, j - 1, currentSum, currentNum);
        
    if (!outOfBorder(i - 1, j) && !visit[i - 1][j])// 向上移动
        DFS(i - 1, j, currentSum, currentNum);
    visit[i][j] = false;
}
int main(){
  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];
        }
    DFS(0,0,0,0);
    if (num == INT_MAX)
        printf("0");// 输出0
    else
        printf("%d",num);
    return 0;
}
复制代码

 

posted @   Tomorrow1126  阅读(118)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
点击右上角即可分享
微信分享提示