P2802 【回家】
2024-09-01 00:44:42
当初做的时候也借鉴了一些题解,发现确实有很多人都是在n和m上分不清。。
好吧,我也没分清。。
然后就一直不停错,还找不出来原因。。
最后狠心把所有判断dfs停止的条件单独列出来,终于找到了问题。。。
具体解释看代码:::
#include<iostream>
using namespace std;
int n,m,ans=;//ans的值要赋大一点
int a[][],b[][];//第一个读入,第二个判断有没有走过
void dfs(int x,int y,int an,int hp){
if(hp==||y>m||x>n||x<=||y<=||a[x][y]==||b[x][y]==||an>ans)return;//判停条件,越界,不是最优解,没有生命值了,有障碍之类的,一定要注意区分n和m,我之前就一直写的是y>n,然后不停70分。
if(a[x][y]==){//如果到终点的情况
ans=min(ans,an);//其实有上面的判断,也可以直接写ans=an,也不会有错
return;//返回
}
if(a[x][y]==)hp=;//泉水。。
b[x][y]=;//标记走过了
dfs(x+,y,an+,hp-);//往上走
dfs(x,y+,an+,hp-);//往右走
dfs(x-,y,an+,hp-);//往下走
dfs(x,y-,an+,hp-);//往左走
b[x][y]=;//之前标记的,现在去掉
}
int main(){
int p,q;
cin>>n>>m;//读入
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
cin>>a[i][j];//读入,考场上建议用scanf,比较快
if(a[i][j]==)p=i,q=j;//一定要标记起点,不然会错,具体几个点不是很清楚。。。
}
}
dfs(p,q,,);//调用函数
if(ans==)cout<<-<<endl;//如果ans值没变,就说明不能到终点,输出-1
else cout<<ans<<endl;//否则输出步数
return ;}
祝大家编程愉快哦~~~
新人开博鼓励一下吧~~~
最新文章
- PHP常用算法
- POJ 2411 Mondriaan&;#39;s Dream
- Windows如何使用jstack跟踪异常代码
- 如何关闭windows电脑的开机自启程序
- openssl 学习之从证书中提取RSA公钥N 和 E
- php-引号中出现$
- JS 公共方法
- $(this) 和 this
- WEB服务器:Apache、Tomcat、JBoss、WebLogic、Websphere、IIS的区别与关系
- Razor Engine,动态脚本语言,mvc上的语法,适用于文件内容生成,静态网页生成等。
- Linux安装git和maven的详细过程
- 通俗易懂的来理解Iaas,Paas,SaaS
- Mac下多个jdk自由切换
- 剑指offer面试题6:重建二叉树
- python 文本或句子切割,并保留分隔符
- 【IPC进程间通讯之二】管道Pipe
- RESTful的理解与设计【PHP】
- Live2D 博客页面添加板娘
- 剑指offer-变态跳台阶09
- DefaultHttpClient 在oppo A57手机上网络请求报错