深搜dfs(多坑)

来源:https://www.luogu.org/problemnew/show/P2802

1.每次移动不要改原变量,最好新建一个变量

2.xue1=7。。。。。。。后面有减一

3.以后写dfs最好不要有返回值,较难剪枝。。。

#include <cstdio>
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

int n,m,x,y,t1;
int a[15][15],tr[15][15];
int move[4][2]={{0,1},{1,0},{0,-1},{-1,0}};

int dfs(int x1,int y1,int xue)
{
	int i,x2,y2,ans=100000,t,xue1;
	
	if (xue==0)
		return -1;
	if (a[x1][y1]==3)
		return 0;
		
	for (i=0;i<4;i++)
	{
		xue1=xue;            //! ! ! ! ! !
		x2=x1+move[i][0];
		y2=y1+move[i][1];
		if (x2<0 || y2<0 || x2>=n || y2>=m)
			continue;
		if (a[x2][y2]==0 || tr[x2][y2]!=0)
			continue;
		else if (a[x2][y2]==4 && xue!=1)    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
			xue1=7;        //!!!!!!!!!!!!!!!!!!!!!!!!!!!
		tr[x2][y2]=1;
		t=dfs(x2,y2,xue1-1);
		tr[x2][y2]=0;
		if (t!=-1)
			ans=min(ans,t+1);
	}
	if (ans==100000)
		return -1;
	return ans;
}

int main()
{
	int i,j;
	
	freopen("a.txt","r",stdin);
	scanf("%d%d",&n,&m);
	for (i=0;i<n;i++)
	{
		for (j=0;j<m;j++)
		{
			scanf("%d",&a[i][j]);
			if (a[i][j]==2)
			{
				x=i;
				y=j;
			}
		}
	}
	memset(tr,0,sizeof(tr));
	tr[x][y]=1;
	t1=dfs(x,y,6);
	printf("%d",t1);
		
		
	return 0;
}

剪枝后。。。(dfs加一个步数,当大于已知结果stop)

#include <cstdio>
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

int n,m,x,y,t1,ans1=1000000;
int a[15][15],tr[15][15];
int move[4][2]={{0,1},{1,0},{0,-1},{-1,0}};

void dfs(int x1,int y1,int xue,int tot)
{
	int i,x2,y2,ans=100000,t,xue1;
	
	if (xue==0)
		return ;
	if (a[x1][y1]==3)
	{
		ans1=min(ans1,tot);
		return ;
	}
	
	if (tot>ans1)
		return ;	
	for (i=0;i<4;i++)
	{
		xue1=xue;
		x2=x1+move[i][0];
		y2=y1+move[i][1];
		if (x2<0 || y2<0 || x2>=n || y2>=m)
			continue;
		if (a[x2][y2]==0 || tr[x2][y2]!=0)
			continue;
		else if (a[x2][y2]==4 && xue!=1)
			xue1=7;
		tr[x2][y2]=1;
		dfs(x2,y2,xue1-1,tot+1);
		tr[x2][y2]=0;
	}
	return ;
}

int main()
{
	int i,j;
	
	freopen("a.txt","r",stdin);
	scanf("%d%d",&n,&m);
	for (i=0;i<n;i++)
	{
		for (j=0;j<m;j++)
		{
			scanf("%d",&a[i][j]);
			if (a[i][j]==2)
			{
				x=i;
				y=j;
			}
		}
	}
	memset(tr,0,sizeof(tr));
	tr[x][y]=1;
	dfs(x,y,6,0);
	if (ans1!=1000000)
		printf("%d",ans1);
	else 
		printf("-1");
		
		
	return 0;
}

猜你喜欢

转载自blog.csdn.net/scutbenson/article/details/81293484