Description
wyy是一个著名动画《境界的彼方》的男主,此时他非常的慌张,因为女主栗山未来进入了境界的彼方内部,并且花费了大量的血量去拯救wyy,wyy此时也进入了境界的彼方,他妈给了他一张地图去寻找境界的彼方的核心去拯救女主,现给你一张n×n的地图,以及男主的位置,问男主要拐弯几次才会到达境界的彼方内部(境界的彼方的位置为(n,n))
不过你以为这就是道搜索题?还得加条件:此时女主血条狂掉,你必须判断此时wyy是否可以走到终点且女主的血条不会掉光,如果掉光了那么输出"Die",如果地图无法到达境界的彼方(他妈坑他)就输出"No",如果到得了终点且女主血条活着输出res代表男主此时要拐弯几次
Input
给出n和k和x1和y1,k代表每拐弯一次女主要耗掉k滴血, 默认女主有100点血, x1和y1代表男主此时所在的位置
Output
根据题目要求输出
Samples
Input
3 3 1 1 110 010 011
Output
2
Input
3 50 1 1 110 010 011
Output
Die
Hint
1表示能走,0表示不能走;血量大于0时表示活着。
Source
石光中学 wyy套题 dfs bfs 深搜 广搜
当时比赛的时候由于种种原因咕咕咕了
现在补了一手
这道题目是比较板子的广搜题
在后面的博客中可能会总结到更多的相应的题目
代码可以更短,为了好理解没有进行处理,更方便理解一些
下面是基本的思路:
为什么要选择BFS ?
因为BFS的一个节点只能是从某一个节点转移过来,并不是从多个点转移过来的(加了vis数组)
而DFS的某一个节点就可能是从若干个节点转移过来的。
而这个题的背景来看,要输出转弯的次数,所以说就要首先有一个唯一的前驱节点转移得到,所以说BFS的优势显而易见,就要用到BFS
在写BFS的时候,我喜欢用cur表示当前的节点用next表示下一个节点,每当访问一个节点之后就将这个节点标记为1(vis数组)
对于开始点的位置,我们很巧妙的将开始的血量当成一个值放进结构体中,并且在搜索的过程中进行传递变化 (此处来源:大佬 )在传递的过程中通过在四个方向的判断中加入转弯次数的变化,从而在最后进行输出(判断当前的方向和下一个的方向是否相同即可)
Main_code()
/*** keep hungry and calm PushyTao!***/ int n,m; int stx,sty; int dx[4]={0,0,-1,1}; int dy[4]={-1,1,0,0}; int a[1007][1007]; int vis[1007][1007]; struct node{ int x; int y; int blood; ///start with 100 int op;/// the operation int cnt; }; bool edge(int x,int y){ if(x>=1&&x<=n&&y>=1&&y<=n) return true; else return false; } void bfs(int x,int y){ queue<node> que; node cur,next; cur.x = x; cur.y = y; cur.blood = 100; cur.op = -1; cur.cnt = 0; que.push(cur); int flag = 0; while(que.size() > 0){ cur = que.front(); que.pop(); /// judge if get the edx and edy if(cur.x == n && cur.y == n){ if(cur.blood < 0){ puts("Die"); }else{ cout<<cur.cnt - 1<<endl; } flag = 1; break; } for(int i=0;i<4;i++){ next.x = cur.x + dx[i]; next.y = cur.y + dy[i]; if(!edge(next.x,next.y)) continue; if(vis[next.x][next.y]) continue; if(a[next.x][next.y] == 0) continue; vis[next.x][next.y] = 1; int op = cur.op; if(i == 2 || i == 3){ next.blood = cur.blood - m; next.op = i; if(op == 2 || op == 3) { next.cnt = cur.cnt; que.push(next); }else{ next.cnt = cur.cnt + 1; que.push(next); } }else { next.blood = cur.blood - m; next.op = i; if(op == 1 || op == 0){ next.cnt = cur.cnt; que.push(next); }else{ next.cnt = cur.cnt + 1; que.push(next); } } } } if(flag == 0) puts("No"); } int main() { n=read,m=read;/// n*n - m / step stx=read,sty=read; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%1d",&a[i][j]); } } if(stx == n && sty == n){ puts("0"); return 0; } bfs(stx,sty); return 0; } /** **/