```cpp
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
int f[110][110],ans,n,m,x,y,c,jl[110][110],jyh[110][110];
void dfs(int x,int y,int k)
{
if (k>=ans) return;
if (jyh[x][y]!=-1)
{
if (jyh[x][y]<=k) return;
}
jyh[x][y]=k;
if (x==m&&y==m)
{
if (k<ans) ans=k;
return;
}
for (int i=0;i<=3;i++)
if (x+dx[i]<=m&&x+dx[i]>0&&y+dy[i]<=m&&y+dy[i]>0)
{
if (f[x+dx[i]][y+dy[i]]==f[x][y]) dfs(x+dx[i],y+dy[i],k);
else if (f[x+dx[i]][y+dy[i]]==-1)
{
if (jl[x][y]!=-1)
{
f[x+dx[i]][y+dy[i]]=0;
if (f[x][y]==f[x+dx[i]][y+dy[i]]) dfs(x+dx[i],y+dy[i],k+2);
else dfs(x+dx[i],y+dy[i],k+3);
f[x+dx[i]][y+dy[i]]=1;
if (f[x][y]==f[x+dx[i]][y+dy[i]]) dfs(x+dx[i],y+dy[i],k+2);
else dfs(x+dx[i],y+dy[i],k+3);
f[x+dx[i]][y+dy[i]]=-1;
}
}
else dfs(x+dx[i],y+dy[i],k+1);
}
}
int main()
{
scanf("%d%d",&m,&n);
for (int i=1;i<=m;i++)
for (int j=1;j<=m;j++)
f[i][j]=-1,jl[i][j]=-1,jyh[i][j]=-1;
for (int i=1;i<=n;i++)
{
scanf("%d%d%d",&x,&y,&c);
f[x][y]=c;
jl[x][y]=c;
}
ans=100000000;
dfs(1,1,0);
if (ans==100000000) printf("-1");
else printf("%d",ans);
}
```
by forever_0805 @ 2021-10-22 12:28:30
自己刚刚打的代码,记忆化做的好一点就可以过了,你的RE是因为你在dfs中的处理有问题,xx=x+dx[i]是有可能会到101的,这样子你的数组就爆掉了
by forever_0805 @ 2021-10-22 12:29:55