简单DFS,样例过不去
查看原帖
简单DFS,样例过不去
495599
CSZD楼主2022/11/17 19:09
#include<iostream>
#include<cstdio>
using namespace std;
int m,n,s,ans=9999;
int a[20][20];
bool f[20][20]; 
int xx[4]={1,-1,0,0},yy[4]={0,0,1,-1};
void dfs(int x,int y,int num,int sum)//坐标 
{
	if(sum>=s)
	{
		if(sum==s) ans=min(ans,num);//取最小值,返回 
		return;
	}
	for(int i=0;i<4;i++)//上下左右搜一遍 
	{
		int xix,yiy;
		xix=x+xx[i];yiy=y+yy[i];
		if(f[xix][yiy]==0&&xix>0&&xix<=m&&yiy>0&&yiy<=n)//如果未切割 
		{
			f[xix][yiy]=1;//标记为切割组 
			dfs(xix,yiy,num+1,sum+a[xix][yiy]);//搜 
			f[xix][yiy]=0;
		}
	}
}
int main()
{
	cin>>m>>n;
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cin>>a[i][j]; 
			s+=a[i][j];
		}
	}
	if(s%2==1)
	{
		cout<<"0"<<endl;
		return 0;
	}
	s/=2;
	f[1][1]=1;
	dfs(1,1,0,0);
	if(ans=9999)cout<<"0";
	else cout<<ans<<endl; 
	return 0;
}
2022/11/17 19:09
加载中...