如下图所示,3 x 3 的格子中填写了一些整数。
我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60。
本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。
如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。
如果无法分割,则输出 0。
程序先读入两个整数 m n 用空格分割 (m,n<10)。
表示表格的宽度和高度。
接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000。
#include <cstdio>
#include <queue>
#include <algorithm>
#include <climits>
#include <cstring>
using namespace std ;
int ans = INT_MAX ;
const int dir[4][2] = {{1,0},{-1,0},{0,-1},{0,1}} ;
int map[15][15] , sum = 0;
bool visited[15][15] ;
int row,col ;
bool judge(int x , int y)
{
if(x<0||y<0||x>=row||y>=col)
{
return false ;
}
return true ;
}
void DFS(int x , int y , int add , int count)
{
if(add == sum/2)
{
if(count<ans)
{
ans = count ;
}
return ;
}
for(int i = 0 ; i < 4 ; ++i)
{
int nextX = x + dir[i][0] , nextY = y + dir[i][1] ;
if(!judge(nextX,nextY))
{
continue ;
}
if(!visited[nextX][nextY]&&add+map[nextX][nextY]<=sum/2)
{
visited[nextX][nextY] = true ;
DFS(nextX,nextY,add+map[nextX][nextY],count+1) ;
visited[nextX][nextY] = false ;
}
}
}
int main()
{
while(scanf("%d%d",&col,&row) != EOF)
{
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 == 1)
{
printf("0\n") ;
continue ;
}
memset(visited,false,sizeof(visited)) ;
ans = INT_MAX ;
DFS(0,0,map[0][0],1) ;
if(ans == INT_MAX)
printf("0\n") ;
else
printf("%d\n",ans) ;
}
return 0 ;
}蓝桥杯 历届试题 剪格子 简单的DFS~~注意输入有陷阱~~
原文:http://blog.csdn.net/lionel_d/article/details/43837287