记忆化深度优先搜索(MDFS)
宏观思路:我们从左上角一直走到右下角,dp[x][y]表示所有走到(x,y)这个格子的所有路中,所需代价最小的值。
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
{
g[i][j]=-1; //先把所有格子都置为-1
dp[i][j]=0x3f3f3f3f; //先赋一个很大的值
}
for(int i=1;i<=n;i++)
{
int x,y,c;
cin>>x>>y>>c;
g[x][y]=c;
}
//按题目所说,表示坐标为(x,y)(x,y)的格子有颜色c
dp[1][1]=0;//左上角第一个格子设为0,这样才能推下去
dfs(1,1,1);//从(1,1)开始深搜
if(dp[m][m]!=0x3f3f3f3f) cout<<dp[m][m];
else cout<<"-1";
return 0;
接下来我们来看一下深搜主体
其实就是按位移增量向四个方向探索,然后判断是否是合法格局(行、列都在1~m之中)。如果当前格子不是-1(这表示它是有颜色的),再判断它是否跟上一个格子颜色相同,如果相同,就搜索下去(中间要剪枝),如果是不相同的颜色,就要花费1个金币。如果一开始当前格子是-1,那么判断是否可以使用魔法。
void dfs(int x,int y,bool f)
// x,y为行号列号;如果f为假,则当前不可使用魔法&