题目描述
如下图所示,3 x 3 的格子中填写了一些整数。
我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是 60。
本题的要求就是请你编程判定:对给定的 m×n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。
如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。
如果无法分割,则输出 0。
输入描述
输入描述
程序先读入两个整数 m,n 用空格分割 (m,n<10),表示表格的宽度和高度。
接下来是 n 行,每行 m 个正整数,用空格分开。每个整数不大于 10^4。
输出描述
在所有解中,包含左上角的分割区可能包含的最小的格子数目。
输入输出样例
示例
输入
3 3
10 1 52
20 30 1
1 2 3
输出
3
运行限制
- 最大运行时间:5s
- 最大运行内存: 64M
def pd(x,y):#判断是否超范围 if 0<=x<=n-1 and 0<=y<=m-1:return True return False def check(c,q):#检查所到格子的数之和是否符合所有格子总和的一半 global ans,sum1 if 2*q>sum1:return False elif 2*q==sum1: if vis[0][0]==1 and ans>c:#是否包含左上角的格子 ans=c return False return True def dfs(x,y,c,q):#坐标,方块数,和 d=[(0,1),(0,-1),(-1,0),(1,0)]#向下,向上,向左,向右 global ans,sum1 if not check(c,q):return vis[x][y]=1 for i in range(4): dx=x+d[i][0];dy=y+d[i][1] if pd(dx,dy) and vis[dx][dy]==0:dfs(dx,dy,c+1,q+s[x][y]) vis[x][y]=0 m,n=map(int,input().split()) s=[] sum1=0#所有格子数目总和 for i in range(n): t=list(map(int,input().split())) sum1+=sum(t) s.append(t) vis=[[0]*m for i in range(n)]#记录该位置是否被使用 ans=10000 dfs(0,0,0,0) print(ans)