洛谷-P3952

本文详细解析了使用深度优先搜索(DFS)算法解决迷宫寻宝问题的方法,通过剪枝技巧优化搜索过程,避免不必要的计算,以达到更高效的解决方案。文章深入探讨了如何利用当前格子的颜色和金币数进行剪枝,以及如何通过记录五个关键变量来实现这一过程。

[题目]

数据范围:

  m<=100

dfs+剪枝

简单剪枝思路:

  如何当前所需要花费的金币数大于已经大于当前走到终点的最小的金币数,就不可能比当还要在少了

dfs采用记录5个变量,分别表示 x坐标,y坐标,花费的钱数,当前格子的颜色,有没有使用魔法......

1 dfs(int x,int y,int cost,int c,int use)

然后判断两个格子的颜色是否相同并且有没有各自是没有颜色.....

  ----  如果都有颜色,判断是是否相同

       ----  下一步没有颜色就改变颜色

 

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int M=100+5;  4 int m,n,col[M][M],val[M][M],vis[M][M],Max=0x3f3f3f3f,x,y,c,xl[5]={0,0,1,-1},yl[5]={1,-1,0,0};  5 void dfs(int x,int y,int cost,int c,int use){  6 if(x<1||x>m||y<1||y>m||cost>=val[x][y])return ;  7 if(x==m&&y==m)Max=min(Max,cost);  8 val[x][y]=cost;  9 for(int i=0;i<4;i++){ 10 int dx=x+xl[i],dy=y+yl[i]; 11 if(c>=0&&col[dx][dy]>=0)dfs(dx,dy,cost+(c==col[dx][dy]?0:1),col[dx][dy],0); 12 if(c>=0&&col[dx][dy]<0&&use==0)dfs(dx,dy,cost+2,c,1); 13  } 14 } 15 int main(){ 16 memset(val,0x3f,sizeof(val)); 17 memset(col,-1,sizeof(col)); 18 scanf("%d %d",&m,&n); 19 for(int i=1;i<=n;i++){ 20 scanf("%d %d %d",&x,&y,&c); 21 col[x][y]=c; 22  } 23 dfs(1,1,0,col[1][1],0); 24 printf("%d\n",Max==0x3f3f3f3f?-1:Max); 25 return 0; 26 }

 

转载于:https://www.cnblogs.com/luogu-yyx/p/9865067.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值