码迷,mamicode.com
首页 > 其他好文 > 详细

剪格子

时间:2016-04-12 00:01:52      阅读:429      评论:0      收藏:0      [点我收藏+]

标签:

题目地址: 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;
}

 

剪格子

标签:

原文地址:http://www.cnblogs.com/mycd/p/5380604.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!