看不懂队列怎么回事,怎么入的栈,怎么出的栈,重载运算符又是干啥的
点击打开 题目 链接
#include<stdio.h> #include<string.h> #include<queue> using namespace std; struct node { int x,y,step; friend bool operator<(node a,node b){ //重载 return a.step>b.step; } }; priority_queue<node> s; char map[304][304]; int m,n,visit[304][304],dir[4][2]={1,0,-1,0,0,1,0,-1}; bool limit(int x,int y) { if(x>=0&&y>=0&&x<m&&y<n&&map[x][y]!='S'&&map[x][y]!='R') return true; else return false; } int tonum(char c) { if(c=='B') return 2; if(c=='E'||c=='T') return 1; } int bfs(int star,int endi) { node temp; visit[star][endi]=1; temp.x=star,temp.y=endi,temp.step=0; s.push(temp); while(!s.empty()){ int ant; temp=s.top(); s.pop(); star=temp.x,endi=temp.y,ant=temp.step; for(int i=0;i<4;i++){ temp.x+=dir[i][0]; temp.y+=dir[i][1]; if(limit(temp.x,temp.y)&&!visit[temp.x][temp.y]){ visit[temp.x][temp.y]=1; temp.step+=tonum(map[temp.x][temp.y]); if(map[temp.x][temp.y]=='T') return temp.step; s.push(temp); } temp.x=star,temp.y=endi,temp.step=ant; } } return -1; } int main() { int star_x,star_y,i,j; while(scanf("%d%d",&m,&n)!=EOF&&(m||n)){ for(i=0;i<m;i++) scanf("%s",map[i]); for(i=0;i<m;i++) for(j=0;j<n;j++){ if(map[i][j]=='Y') star_x=i,star_y=j; } memset(visit,0,sizeof(visit)); printf("%d\n",bfs(star_x,star_y)); while(!s.empty()) s.pop(); memset(map,0,sizeof(map)); } return 0; }