zoukankan      html  css  js  c++  java
  • 蓝桥杯:剪格子

    题目地址: http://lx.lanqiao.org/problem.page?gpid=T27

    剪开后两边各自的和都是总和的一半。做法是从左上角开始DFS,每次减去搜索到的格子直到为0,然后判断是否为格子最少的情况。

    #include <cstdio>
    #include <iostream>
    using namespace std;
    #define MAX 15
    int grid[MAX][MAX], queue[MAX*MAX], vis[MAX][MAX];
    int mini = 99999, m, n;
    //sum=0则成功,算为一种情况。tot为包含左上角的块数 
    void dfs(int a, int b, int sum, int tot)
    {
        //超出范围则直接返回 
      if(a>=n || a<0) return;
      if(b>=m || b<0) return;
      if(sum < 0) return;
      if(sum == 0)
        if(mini > tot)
        {
          mini = tot;
          return;
        }
      vis[a][b] = 1;
      //向四个方向搜索 
      if(vis[a][b+1] == 0)  dfs(a, b+1, sum-grid[a][b+1], tot+1);
      if(vis[a][b-1] == 0)  dfs(a, b-1, sum-grid[a][b-1], tot+1);
      if(vis[a+1][b] == 0)  dfs(a+1, b, sum-grid[a+1][b], tot+1);
      if(vis[a-1][b] == 0)  dfs(a-1, b, sum-grid[a-1][b], tot+1);
      vis[a][b] = 0;
    }
    
    int main(void)
    {
        //freopen("grid.in","r",stdin);
        int sum=0;
        scanf("%d %d",&m,&n);
        for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
        {
          scanf("%d",&grid[i][j]);
          sum+=grid[i][j];
        }
      //如果是奇数,则不可行  
      if(sum%2 != 0)    
        {
            printf("0
    ");
            return 0;
        }  
        //从(0,0)开始搜索
      dfs(0, 0, sum/2-grid[0][0], 1);
      printf("%d
    ",mini);
        return 0;
    }
  • 相关阅读:
    WHU 1540 Fibonacci 递推
    CSU 1378 Shipura 简单模拟
    UVALive 6486 Skyscrapers 简单动态规划
    JAVA杂记
    JAVA的main方法
    Java中的System类
    认识理解Java中native方法(本地方法)
    JAVA导入支持类
    从UDP的”连接性”说起–告知你不为人知的UDP
    udp如何实现可靠性传输?
  • 原文地址:https://www.cnblogs.com/mycd/p/5380604.html
Copyright © 2011-2022 走看看