标签:
如下图所示,3 x 3 的格子中填写了一些整数。
我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60。
本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。
如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。
如果无法分割,则输出 0。
程序先读入两个整数 m n 用空格分割 (m,n<10)。
表示表格的宽度和高度。
接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int map[11][11],vis[11][11]; int n,m,cnt; int flag=0; void dfs(int x,int y,int sum,int t) { if(sum==cnt/2&&flag==0) { printf("%d\n",t); flag=1; return ; } if(sum>cnt/2) return ; if(y+1<n&&vis[x][y+1]==0) { vis[x][y+1]=1; dfs(x,y+1,sum+map[x][y+1],t+1); vis[x][y+1]=0; } if(x+1<m&&vis[x+1][y]==0) { vis[x+1][y]=1; dfs(x+1,y,sum+map[x+1][y],t+1); vis[x+1][y]=0; } if(y-1>=0&&vis[x][y-1]==0) { vis[x][y-1]=1; dfs(x,y-1,sum+map[x][y-1],t+1); vis[x][y-1]=0; } if(x-1>=0&&vis[x-1][y]==0) { vis[x-1][y]=1; dfs(x-1,y,sum+map[x-1][y],t+1); vis[x-1][y]=0; } } int main() { int i,j; memset(vis,0,sizeof(vis)); memset(map,0,sizeof(map)); scanf("%d%d",&n,&m); cnt=0; for(i=0;i<m;i++) for(j=0;j<n;j++) { scanf("%d",&map[i][j]); cnt+=map[i][j]; } if(cnt%2!=0) printf("0\n"); else { vis[0][0]=1; dfs(0,0,map[0][0],1); } return 0; }
标签:
原文地址:http://www.cnblogs.com/cancangood/p/4379274.html