3 条题解
-
-4
写题解请注意 鼓励大家写题解,但注意题解格式。
题解一定要有思路解析或代码注释,能否让别人理解你的思路
也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。
给代码两端加上这个会舒服一些
```cpp
你的代码
```
</span>
这个点在键盘的左上角tab上面那个键,注意切换输入法
#include<iostream> using namespace std; int main() { int n; cin>>n;//这是一个注释 return 0; }
请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。
抄袭题解一经发现直接取消成绩。
题解被删除的可能
- 代码不符合格式规范
- 没有思路讲解或者没有注释,
- 无意义的题解
大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。
-
-4
本题并不是所有的点只能走一次就可以,因为有一个hp血量的存在,所以不能直接求出发点到家的 最短次数。如果不重复走某些格子,可能还没走到就死了。所以考虑是否重复走某些格子的时候, 主要看这次走的时候目前的血量是否高于前一次走的血量,如果高于就可以走。用vis数组记录经过 这个时的最大hp,bfs把能走的加入队列,走重复点的时候如果当前hp大于之前那一次hp,就更新 vis。有金币的走一次就够了,因为走一次hp就补满了。 #include<bits/stdc++.h> using namespace std; int dy[4]={0,1,0,-1}; int dx[4]={-1,0,1,0}; int vis[10][10]; bool flag; struct point { int x,y,step,hp;//step是步数,hp是血量。 }; queue<point> q; int n,m,a[10][10],startx,starty,endx,endy; void bfs(int x,int y) { q.push((point){x,y,0,6}); while(q.size()>0) { point now=q.front(); q.pop(); int sx=now.x,sy=now.y,ss=now.step,sh=now.hp; if(a[sx][sy]==3)//到家了就直接结束 { flag=true; cout<<ss; return ; } if(sh>1)//血量小于等于1还没到家就是死了 { for(int i=0;i<4;i++) { int nx=sx+dx[i]; int ny=sy+dy[i]; if(nx>=1&&nx<=n&&ny>=1&&ny<=m) { if(a[nx][ny]==1||a[nx][ny]==3) //下一个是空地或者家 { if(vis[nx][ny]<sh-1)//当前hp是sh-1大于之前的vis { vis[nx][ny]=sh-1; q.push((point){nx,ny,ss+1,sh-1}); } } if(a[nx][ny]==4) { if(!vis[nx][ny]) { vis[nx][ny]=1; q.push((point){nx,ny,ss+1,6}); } } } } } } } int main() { cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>a[i][j]; if(a[i][j]==2) startx=i,starty=j; if(a[i][j]==3) endx=i,endy=j; } } bfs(startx,starty); if(!flag) cout<<-1; return 0; }
- 1
信息
- ID
- 910
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 2
- 标签
- 递交数
- 67
- 已通过
- 39
- 上传者