P2802 【回家】

(づ ̄3 ̄)づ╭❤~(题面哦~~)

当初做的时候也借鉴了一些题解,发现确实有很多人都是在n和m上分不清。。

好吧,我也没分清。。

然后就一直不停错,还找不出来原因。。

最后狠心把所有判断dfs停止的条件单独列出来,终于找到了问题。。。

具体解释看代码:::

 1 #include<iostream>
 2 using namespace std;
 3 int n,m,ans=10000;//ans的值要赋大一点
 4 int a[15][15],b[15][15];//第一个读入,第二个判断有没有走过
 5 void dfs(int x,int y,int an,int hp){
 6     if(hp==0||y>m||x>n||x<=0||y<=0||a[x][y]==0||b[x][y]==1||an>ans)return;//判停条件,越界,不是最优解,没有生命值了,有障碍之类的,一定要注意区分n和m,我之前就一直写的是y>n,然后不停70分。
 7     if(a[x][y]==3){//如果到终点的情况
 8         ans=min(ans,an);//其实有上面的判断,也可以直接写ans=an,也不会有错
 9         return;//返回
10     }
11     if(a[x][y]==4)hp=6;//泉水。。
12     b[x][y]=1;//标记走过了
13     dfs(x+1,y,an+1,hp-1);//往上走
14     dfs(x,y+1,an+1,hp-1);//往右走
15     dfs(x-1,y,an+1,hp-1);//往下走
16     dfs(x,y-1,an+1,hp-1);//往左走
17     b[x][y]=0;//之前标记的,现在去掉
18 }
19 int main(){
20     int p,q;
21     cin>>n>>m;//读入
22     for(int i=1;i<=n;i++){
23         for(int j=1;j<=m;j++){
24             cin>>a[i][j];//读入,考场上建议用scanf,比较快
25             if(a[i][j]==2)p=i,q=j;//一定要标记起点,不然会错,具体几个点不是很清楚。。。
26         }
27 }
28     dfs(p,q,0,6);//调用函数
29     if(ans==10000)cout<<-1<<endl;//如果ans值没变,就说明不能到终点,输出-1
30     else cout<<ans<<endl;//否则输出步数
31     return 0;}

祝大家编程愉快哦~~~

新人开博鼓励一下吧~~~

转载于:https://www.cnblogs.com/hahaha2124652975/p/11123124.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值