题目大意:
这是一道搜索题,猪脚身上被绑上了炸弹,经过6秒后就会爆炸,幸运的是地图上有炸弹重置装置,能使炸弹的剩余时间重置为6秒,现在问题来了,问猪脚能否安全地从起点走到终点,如果可以的话求出最少时间。
解题思路:
这个BFS和普通的BFS有点不同,我们不需要标记已走过的路径。只有在经过重置装置的时间,才把重置装置改为简单的通路。
不用害怕超时,因为在定义节点的时间多添加了一个剩余时间变量,当剩余时间为0时,节点会自动停止回溯。
源代码:
#include<iostream> #include<queue> using namespace std; int sx,sy; int map[9][9]; int n,m,u; int dir[4][2]={1,0,-1,0,0,1,0,-1}; struct node{ int x,y,step,bomb; }w,p; int bfs(); int main() { cin>>u; while(u--) { cin>>n>>m; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { cin>>map[i][j]; if(map[i][j]==2) { sx=i; sy=j; } } cout<<bfs()<<endl; } return 0; } int bfs() { queue<node> q; while(!q.empty()) q.pop(); w.x=sx;w.y=sy;w.step=0;w.bomb=6; q.push(w); while(!q.empty()) { p=q.front(); q.pop(); if(map[p.x][p.y]==3) return p.step; for(int i=0;i<4;i++) { w.x=p.x+dir[i][0]; w.y=p.y+dir[i][1]; w.step=p.step+1; w.bomb=p.bomb-1; if(w.x>=0&&w.x<n&&w.y>=0&&w.y<m&&map[w.x][w.y]!=0&&w.bomb>0) { if(map[w.x][w.y]==4) { w.bomb=6; map[w.x][w.y]=0; } q.push(w); } } } return -1; }当前水平评级:4