dfs怎么剪枝
查看原帖
dfs怎么剪枝
1162093
jimmy0926楼主2024/4/6 15:06

蒟蒻 彻底的 TLE 了 ,有大佬教教怎么剪枝吗?

代码在此:

#include <bits/stdc++.h>
using namespace std;
int m,n,ans=0x7fffffff;
int mp[101][101];
const int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
bool vis[101][101];
void dfs(int,int,int,bool);

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>m>>n;
	for(int i=1;i<=n;i++)
	{
		int x,y,c;
		cin>>x>>y>>c;
		mp[x][y]=(++c);
	}
	vis[1][1]=1;
	dfs(1,1,0,0);
	cout<<(ans==0x7fffffff? -1 : ans);
	return 0;
}
void dfs(int i,int j,int num,bool used)
{
	if(i==m && j==m)
	{
		ans=min(ans,num);
		return;
	}
	
	for(int k=0;k<4;k++)
	{
		int nx=i+dx[k],ny=j+dy[k];
		if(nx<1 || ny<1 || nx>m || ny>m || vis[nx][ny])
			continue;
		if(mp[nx][ny])
		{
			vis[nx][ny]=1;
			if(mp[i][j]==mp[nx][ny])
				dfs(nx,ny,num,0);
			else
				dfs(nx,ny,num+1,0);
			vis[nx][ny]=0;
		}
		else if(!used)
		{
			mp[nx][ny]=mp[i][j];
			vis[nx][ny]=1;
			dfs(nx,ny,num+2,1);
			mp[nx][ny]=0;
			vis[nx][ny]=0;
		}
	}
}
2024/4/6 15:06
加载中...