剪格子

题目地址: 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\n");
        return 0;
    }
    //从(0,0)开始搜索
  dfs(0, 0, sum/2-grid[0][0], 1);
  printf("%d\n",mini);
    return 0;
}
时间: 2024-08-06 22:18:57

剪格子的相关文章

蓝桥杯 剪格子

就是从0,0开始走一个凸多边形出来,找出走出一半的最小步数-- #include<iostream> #include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector> #include<algor

【蓝桥杯】历届试题 剪格子(未完成)

  历届试题 剪格子   时间限制:1.0s   内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+|10* 1|52|+--****--+|20|30* 1|*******--+| 1| 2| 3|+--+--+--+ 我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等. 如果存在多种解答,请输出包含左上角格

蓝桥杯 历届试题 剪格子 简单的DFS~~注意输入有陷阱~~

历届试题 剪格子 时间限制:1.0s   内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+--+--+ 我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等. 如果存在多种解答,请输出包含左上

【蓝桥杯】 PREV-4 剪格子

题目链接:http://lx.lanqiao.org/problem.page?gpid=T27 历届试题 剪格子 时间限制:1.0s   内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+--+--+ 我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格

蓝桥杯 - 剪格子 (简单DFS)

历届试题 剪格子 时间限制:1.0s   内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+--+--+ 我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等. 如果存在多种解答,请输出包含左上

蓝桥杯 历届试题 剪格子

历届试题 剪格子 时间限制:1.0s   内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+|10* 1|52|+--****--+|20|30* 1|*******--+| 1| 2| 3|+--+--+--+ 我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等. 如果存在多种解答,请输出包含左上角格子的那个

剪格子—题解

1. 剪格子 如图p1.jpg所示,3 x 3 的格子中填写了一些整数. 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等. 如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目. 如果无法分割,则输出 0 程序输入输出格式要求: 程序先读入两个整数 m n 用空格分割 (m,n<10) 表示表格的宽度和高度 接下来是n行,每行m个正整数,用空格分

蓝桥杯:标题:剪格子

标题:剪格子 p1.jpg p2.jpg 如图p1.jpg所示,3 x 3 的格子中填写了一些整数. 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等. 如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目. 如果无法分割,则输出 0 程序输入输出格式要求: 程序先读入两个整数 m n 用空格分割 (m,n<10) 表示表格的宽度和高度 接下来是n

蓝桥杯_PREV_4剪格子

题目: 历届试题 剪格子 时间限制:1.0s   内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+--+--+ 我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等. 如果存在多种解答,请输出