题目地址: http://lx.lanqiao.org/problem.page?gpid=T27
剪开后两边各自的和都是总和的一半。做法是从左上角开始DFS,每次减去搜索到的格子直到为0,然后判断是否为格子最少的情况。
#include#include using namespace std;#define MAX 15int 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