萌新刚学记忆化搜索,只有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;
}