蓝桥杯剪格子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 @ 2020-02-02 20:04  Tomorrow1126  阅读(116)  评论(0编辑  收藏  举报