问题 1432: [蓝桥杯][2013年第四届真题]剪格子
时间限制: 1Sec 内存限制: 128MB 提交: 1111 解决: 381
题目描述
历届试题 剪格子
时间限制:1.0s 内存限制:256.0MB
问题描述
如下图所示,3 x 3 的格子中填写了一些整数。
+--*--+--+
|10* 1|52|
+--****--+
|20|30* 1|
*******--+
| 1| 2| 3|
+--+--+--+
我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60。
本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。
如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。
如果无法分割,则输出 0。
输入
程序先读入两个整数 m n 用空格分割 (m,n< 10)。
表示表格的宽度和高度。
接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000。
输出
输出一个整数,表示在所有解中,包含左上角的分割区可能包含的最小的格子数目。
样例输入
3 3 10 1 52 20 30 1 1 2 3
样例输出
扫描二维码关注公众号,回复:
5881252 查看本文章
3
提示
C语言在线学习平台微信号dotcpp
来源
历届试题
本来我是用的BFS做的 但是不知道为什么BFS总是过不了 ,最多就只能过25% 的测试。但是理论上说不通啊 ,这道题第一反应不就是BFS嘛 这里还是放下我的WA代码吧。下面有个DFS过了
BFS WA的 WA的 WA的
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <stdio.h>
#include <ctype.h>
#include <bitset>
#define LL long long
#define ULL unsigned long long
#define mod 1000000007
#define INF 0x7ffffff
#define mem(a,b) memset(a,b,sizeof(a))
#define MODD(a,b) (((a%b)+b)%b)
#define PI 3.1415927
#define N 15
using namespace std;
struct node
{
int x;
int y;
int step;
int sum;
};
int sum=0;
int mp[N][N];
int vis[N][N];
int dx[4]= {1,-1,0,0};
int dy[4]= {0,0,1,-1};
int n,m;
int BFS()
{
queue<node> Q;
//while(Q.empty()) Q.pop();
node q,p;
p.x=0;
p.y=0;
p.step=1;
p.sum=mp[0][0];
Q.push(p);
vis[0][0]=1;
int nx,ny;
//printf("%d\n",Q.front().x);
while(!Q.empty())
{
p=Q.front();
Q.pop();
if(p.sum==sum) return p.step;
for(int i=0; i<4; i++)
{
nx=p.x+dx[i];
ny=p.y+dy[i];
if(nx<0||nx>=n||ny<0||ny>=m||vis[nx][ny]) continue;
else
{
q.sum=mp[nx][ny]+p.sum;
q.x=nx;
q.y=ny;
q.step=p.step+1;
vis[nx][ny]=1;
Q.push(q);
}
}
}
return 0;
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
scanf("%d",&mp[i][j]);
sum+=mp[i][j];
}
}
sum/=2;
printf("%d\n",BFS());
return 0;
}
DFS AC的
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <stdio.h>
#include <ctype.h>
#include <bitset>
#define LL long long
#define ULL unsigned long long
#define mod 1000000007
#define INF 0x7ffffff
#define mem(a,b) memset(a,b,sizeof(a))
#define MODD(a,b) (((a%b)+b)%b)
#define PI 3.1415927
#define N 15
using namespace std;
struct node
{
int x;
int y;
int step;
int sum;
};
int sum=0;
int mp[N][N];
int vis[N][N];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int n,m;
int step=1;
int judge(int x,int y,int cot)
{
if(x>=n||x<0||y>=m||y<0) return 0;
if(mp[x][y]+cot>sum) return 0;
if(vis[x][y]) return 0;
return 1;
}
int DFS(int x,int y,int cot)
{
int nx,ny;
//printf("-%d-\n",cot);
if(cot==sum) return 1;
for(int i=0;i<4;i++){
nx = x + dx[i];
ny = y + dy[i];
if(!judge(nx,ny,cot)) continue;
vis[nx][ny] = 1;
int res = DFS(nx,ny,cot+mp[nx][ny]);
if(res) return res+1;
vis[nx][ny] = 0;
}
return 0;//开始这个return我忘记了 一直在debug
}
int main()
{
scanf("%d%d",&m,&n);
mem(vis,0);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%d",&mp[i][j]);
sum+=mp[i][j];
}
}
if(sum%2) printf("0\n");
sum/=2;
vis[0][0]=1;
printf("%d\n",DFS(0,0,mp[0][0]));
return 0;
}