蓝桥试题 剪格子 问题描述 如下图所示,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。 输出格式 输出一个整数,表示在所有解中,包含左上角的分割区可能包含的最小的格子数目。 样例输入1 3 3 10 1 52 20 30 1 1 2 3 样例输出1 3 样例输入2 4 3 1 1 1 1 1 30 80 2 1 1 1 100 样例输出2 10 思路比较简单就是把走一个格子加一个格子不符合条件了就返回到上一个; #include<iostream> #include<algorithm> #include<string.h> #include<string> #include<stdio.h> using namespace std; int dx[4]={0,1,0,-1}; //和下面那个数组一起组成平面上4个方向 int dy[4]={1,0,-1,0}; int a[15][15]; bool visit[15][15]; //记录是否被搜索过 int m,n,sum=0; int judge(int x,int y,int num) //判断 { if(x<0||y<0||x>=m||y>=n) //是否越界 { return 0; } if(visit[x][y]) //是否搜过 { return 0; } if(num+a[x][y]>(sum/2)) //是否不符合条件 { return 0; } return 1; } int dfs(int x,int y,int num) { if(num==(sum/2)) //符合条件 { return 1; } for(int i=0; i<4; i++) //四个方向搜索 { int nx=x+dx[i]; int ny=y+dy[i]; if(judge(nx,ny,num)) //符合条件进行 { visit[nx][ny]=true; //把这个点的状态改成搜索过 int ant=dfs(nx,ny,num+a[nx][ny]); //这题需要的是成员个数,在最后一个循环return1以后ant就是1然后进行下一个判断是符合的return ant+1也就是2,那么到最后一个return结果就是需要的个数 if(ant) { return ant+1; } visit[nx][ny]=false; //如果全都不是就返回一步把这步操作取消 } } return 0; } int main() { int s; memset(visit,0,sizeof(visit)); //初始化这个记录状态的数组的初值全都变成0也就是false scanf("%d %d", &m, &n); for(int i=0; i<m; i++) { for(int j=0; j<n; j++) { scanf("%d", &a[i][j]); sum+=a[i][j]; } } visit[0][0]=false; s=dfs(0,0,a[0][0]); printf("%d", s); return 0; } |