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;
    }
  • 相关阅读:
    window对象open方法详解
    jse中将数据反转
    jqery实现10X10的表格,双击消失
    Filter实现登录功能限制
    jQuery全选功能
    Fliter设置字符编码,解决中文问题
    innerHTML、innerText和outerHTML、outerText的区别
    Delphi ActiveX Form的使用实例
    Mina 客户端,服务器简单Demo
    Mina 资料
  • 原文地址:https://www.cnblogs.com/mycd/p/5380604.html
Copyright © 2011-2022 走看看