萌新求助
查看原帖
萌新求助
239243
kong_xin_qi楼主2021/7/28 22:49

萌新刚学记忆化搜索,只有40分,求大佬帮助

#include <iostream>
using namespace std;
int a[101][101];
int m;
int minx[101][101];
bool vis[101][101];
bool pan=true;
int xx[4]={0,1,-1,0}, yy[4]={1,0,0,-1};
void dfs(int p, int q, int ans)
{
	if(p==m&&q==m)
	{
		if(minx[m][m]>ans)
			minx[m][m]=ans;
		return;
	}
	for(int i=0;i<4;i++)
	{
		int nx=p+xx[i], ny=q+yy[i];
		if(nx>=1&&nx<=m&&ny>=1&&ny<=m&&vis[nx][ny]==0)
			if(a[nx][ny]==0)//空白颜色的格子 
			{
				if(pan==true)//当前格子不是用魔法变来的
					if(ans+2<minx[nx][ny]) //剪枝,花费小于走到这个位置的最小花费才走 
					{
						minx[nx][ny]=ans+2;
						vis[nx][ny]=1;
						pan=false;
						a[nx][ny]=a[p][q];
						dfs(nx,ny,ans+2);
						a[nx][ny]=0;
						pan=true;
					}
			}
			else
			{
				if(a[nx][ny]!=a[p][q])
				{
					if(ans+1<minx[nx][ny])//剪枝,同上 
					{
						minx[nx][ny]=ans+1;
						pan=true;
						vis[nx][ny]=1;
						dfs(nx,ny,ans+1);
						vis[nx][ny]=0;	
					}
				}
				else
				{
					if(ans<minx[nx][ny])
					{
						pan=true;
						minx[nx][ny]=ans;
						vis[nx][ny]=1;
						dfs(nx,ny,ans);
						vis[nx][ny]=0;
					}
				}
			}
	}
}
int main()
{
	int n, x, y, c;
	cin>>m>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>x>>y>>c;
		if(c==1)
			a[x][y]=2;
		else 
			if(c==0)
				a[x][y]=1;
			else
				a[x][y]=0;	
	}
	for(int i=1;i<=m;i++)
		for(int j=1;j<=m;j++)
			minx[i][j]=1e7;
	vis[1][1]=1;
	minx[1][1]=0;
	dfs(1,1,0);
	if(minx[m][m]!=1e7)
		cout<<minx[m][m]<<endl;
	else
		cout<<-1<<endl;
	return 0;
} 
2021/7/28 22:49
加载中...