代码如下: 样例都过不去
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
int num,ans=MAXN;
bool grid[110][110];
int vis[110][110];
int n,m;
int x,y,c;
struct point{
int r,c;
point()
{
r=0;c=0;
}
point(int ar,int cr)
{
r=ar,c=cr;
}
point friend operator + (point a,point b)
{
return point(a.r+b.r,a.c+b.c);
}
};
point offset[4]={point(0,1),point(0,-1),point(1,0),point(-1,0)};
void dfs(point cp,int coin,int color,bool flag)//当前点的坐标 当前金币数量 当前颜色 是否使用魔法
{
if (cp.r==m&&cp.c==m)
{
//cout<<coin<<" "<<color<<endl;
ans=min(ans,coin);
return;
}
for (int i=0;i<4;i++)
{
point np=cp+offset[i];
if(0<np.r&&np.r<=m&&0<np.c&&np.c<=m&&grid[np.r][np.c]==0)
{
if(vis[np.r][np.c]==color)
{
grid[np.r][np.c]=1;
//cout<<"a"<<endl;
dfs(np,coin,color,0);
grid[np.r][np.c]=0;
}
else if(vis[np.r][np.c]!=-1)
{
grid[np.r][np.c]=1;
//cout<<"b"<<endl;
dfs(np,coin+1,vis[np.r][np.c],0);
grid[np.r][np.c]=0;
}
else if(flag==0)
{
grid[np.r][np.c]=1;
//cout<<"c"<<endl;
dfs(np,coin+2,1,1);
dfs(np,coin+2,0,1);
grid[np.r][np.c]=0;
}
}
}
}
int main()
{
memset(vis,-1,sizeof(vis));
cin>>m>>n;
int x,y,c;
for (int i=1;i<=n;i++)
{
cin>>x>>y>>c;
vis[x][y]=c;
}
grid[1][1]=1;
dfs(point(1,1),0,vis[1][1],0);
if(ans==MAXN)
{
cout<<"-1"<<endl;
}
else
{
cout<<ans<<endl;
}
return 0;
}