第一次 做的 优先队列 发现了 不少 问题 基础 不是 很熟练 常常 犯 基础性错误 写完就去 回顾基础 !!!!!!!!
这种 有权图 以后 就应该用 优先队列 去做了 不然 就 上午的想法 一塌糊涂 还是这种 优先队列 求 有权图最短路径方便一点
题也挺简单的 , 就是基础不是很牢固 . 下面附上水货 代码
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 using namespace std; 9 struct node 10 { 11 int x,y,step; 12 friend bool operator <(node s1,node s2) // 定义结构体 的时候 这个 就是 用于 优先队列的 基准排序 13 { 14 return s1.step>s2.step; 15 } 16 }; 17 char a[305][305]; 18 int bx,by,n,m,visited[305][305],b[4][2]={0,-1,0,1,-1,0,1,0}; 19 int ans=1000000; 20 priority_queue<node>Q; 21 void BFS(int x,int y) 22 { 23 node q; 24 q={x,y,0}; 25 Q.push(q); 26 while(!Q.empty()) 27 { 28 node e=Q.top(); // 现在的 压迫 已经预示了 在未来某个对称时间的 爆发 . 29 for(int i=0;i<4;i++) 30 { 31 node w; 32 w.x=e.x+b[i][0]; 33 w.y=e.y+b[i][1]; 34 if(w.x>=0&&w.x<m&&w.y>=0&&w.y<n&&a[w.y][w.x]!='R'&&a[w.y][w.x]!='S'&&!visited[w.y][w.x]) 35 { 36 visited[w.y][w.x]=1; 37 if(a[w.y][w.x]=='B') 38 { 39 w.step=e.step+2; 40 Q.push(w); 41 } 42 else 43 { 44 w.step=e.step+1; 45 Q.push(w); 46 } 47 if(a[w.y][w.x]=='T') 48 { 49 ans=w.step; 50 break; 51 } 52 } 53 if(ans!=1000000) 54 break; 55 } 56 Q.pop(); 57 } 58 while(!Q.empty()) 59 Q.pop(); 60 } 61 int main() 62 { 63 while(scanf("%d%d",&n,&m),(n||m)) 64 { 65 memset(a,'