55pts,没t,求改正
#include <cstdio>
#include <cstring>
namespace cjh{
#define rep(i,l,r) for(int i=(l),end##i=(r);i<=end##i;i++)
#define dwn(i,l,r) for(int i=(l),end##i=(r);i>=end##i;i--)
#define ll long long
#define ull unsigned long long
#define mset(a,num) std::memset(a,num,sizeof(a))
struct Math{
template<class T> T abs(T _){return _<0?-_:_;}
template<class T> T max(T _,T __){return _<__?__:_;}
template<class T> T min(T _,T __){return _>__?__:_;}
template<class T> void swap(T &_,T &__){T ___=_;_=__;__=___;}
template<class T> T chkmax(T &_,T __){return _<__?(_=__,__):_;}
template<class T> T chkmin(T &_,T __){return _>__?(_=__,__):_;}
} mth;
}//头文件请无视
using cjh::mth;
using std::scanf;
using std::printf;
const int dx[5]={0,-1,0,0,1},
dy[5]={0,0,-1,1,0};
int n,m,a[110][110],ans=30000;
int rmb[110][110];
bool vis[110][110];
int dfs(int x,int y,bool hp){
if(rmb[x][y]>-1) return rmb[x][y];
if(x==n&&y==n) return rmb[x][y]=0;
//printf("%d %d %d\n",x,y,rmb[x][y]);
int ans=0x3f3f3f3f;
rep(i,1,4){
int tmpx=x+dx[i],tmpy=y+dy[i];
if(tmpx<1||n<tmpx||tmpy<1||n<tmpy||vis[tmpx][tmpy]) continue;
if(a[tmpx][tmpy]==0){
if(hp){
a[tmpx][tmpy]=a[x][y],vis[tmpx][tmpy]=1;//回溯并把下一格的的颜色改成这一格的
mth.chkmin(ans,dfs(tmpx,tmpy,0)+2);
a[tmpx][tmpy]=0,vis[tmpx][tmpy]=0;
}
}else{
if(a[tmpx][tmpy]==a[x][y]){
vis[tmpx][tmpy]=1;//回溯
mth.chkmin(ans,dfs(tmpx,tmpy,1));
vis[tmpx][tmpy]=0;
}else{
vis[tmpx][tmpy]=1;//回溯
mth.chkmin(ans,dfs(tmpx,tmpy,1)+1);
vis[tmpx][tmpy]=0;
}
}
}
return rmb[x][y]=ans;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
mset(rmb,-1);
scanf("%d%d",&n,&m);
rep(i,1,m){int x,y,c;
scanf("%d%d%d",&x,&y,&c);
a[x][y]=c+1;
}
int tmp=dfs(1,1,1);
printf("%d",tmp==0x3f3f3f3f?-1:tmp);
// rep(i,1,n){
// rep(j,1,n) printf("%d ",rmb[i][j]);
// puts("");
// }
return 0;
}