标签:
题目地址: 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