#include <iostream>
using namespace std;
int dfsn(int x,int y,int sum);
int map[20][20];
int vis[20][20];
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int m,n,s;
int main()
{
int sum=0;
cin>>m>>n;
int i,j;
for (i=0;i<m;i++)
for (j=0;j<n;j++)
{
cin>>map[i][j];
sum+=map[i][j];
}
if (sum%2!=0) cout<<0<<endl;
else if (sum/2==map[0][0]) cout<<1<<endl;
else
{
s=sum/2;
vis[0][0]=1;
cout<<dfsn(0,0,map[0][0])<<endl;
}
return 0;
}
int dfsn(int x,int y,int sum)
{
if (sum==s) return 1;//到了加完最后一个数后,返回1个格子数目 (从最后一层慢慢累加回去)
int i;
int ans=0;//ans用来记录左上角的分割区可能包含的最小的格子数目
for (i=0;i<4;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
if (0<=nx && nx<m && 0<=ny && ny<n )
{
if (sum+map[nx][ny]<=s && vis[nx][ny]!=1)
{
vis[nx][ny]=1;
//sum=sum+map[nx][ny]; 不能这样写,只能写成ans=dfsn(nx,ny,num+map[nx][ny];**但是不知道为什么。。。
ans=dfsn(nx,ny,sum+map[nx][ny]);
if (ans!=0) return ans+1;//慢慢累加回最顶层
vis[nx][ny]=0;//初始化标志
}
}
}
return 0;
}
蓝桥杯——剪格子(DFS)
最新推荐文章于 2023-01-06 12:53:09 发布