您的位置:首页 > 其它

问题 1432: [蓝桥杯][历届试题]剪格子

2018-03-29 19:24 351 查看
点击打开链接查看题目

从第一个格子开始进行深搜,则搜到认为是划分在一起的,未搜到认为是另一部分。#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <stdlib.h>

using namespace std;

int row,col,ans,half;
int Map[15][15];
int vis[15][15];
int dir[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
void dfs(int x,int y,int sum,int depth) {
//当前和为一半,看是否可以更新答案。
if(sum == half) {
ans = min(ans,depth);
return;
}
//减枝
if(sum>half || depth>=ans) return;
for(int i = 0; i < 4; i++){
int dx = x + dir[i][0];
int dy = y + dir[i][1];
if(dx>=0&&dx<row&&dy>=0&&dy<col&&vis[dx][dy]==0) {
vis[dx][dy] = 1;
dfs(dx,dy,sum+Map[dx][dy],depth+1);
vis[dx][dy] = 0;
}
}
}

int main() {
while(~scanf("%d%d",&col,&row)) {
int sum = 0;
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
scanf("%d",&Map[i][j]);
sum += Map[i][j];
}
}
//题目给出数据无法平分。
if(sum%2) {
printf("0\n");
}
else {
half = sum/2;
memset(vis,0,sizeof(vis));
ans = row*col;
vis[0][0] = 1;
dfs(0,0,Map[0][0],1);
printf("%d\n",ans);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: