题目
题解
这题用单纯的广搜能得到从起点到终点的最少步数,但费用却不一定是最小的,故需要在广搜的基础上加上优先队列解决。
Code
#include<bits/stdc++.h> #define debug1(x) cout<<#x<<"="<<x<<endl #define debug2(x,y) cout<<#x<<"="<<x<<' '<<#y<<"="<<y<<endl using namespace std; const int maxn=1e4+10; typedef long long ll; struct node { int x,y,cost; bool operator<(const node &a)const{ //结构体重载小于号 return cost>a.cost; //优先队列默认是从大到小,此处操作使其变为从小到大排序 } }Q,B; int main() { int n,m,qx,qy,zx,zy; int next[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; while(~scanf("%d%d",&n,&m)) { getchar(); char G[105][105]={}; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ scanf("%c",&G[i][j]); } getchar(); } scanf("%d%d%d%d",&qx,&qy,&zx,&zy); if(qx==zx&&qy==zy){ printf("0 "); continue; } int book[105][105]={},tx,ty,y=0,ans=0; priority_queue<node>que; que.push({qx,qy,0}); book[qx][qy]=1; while(!que.empty()) { B=que.top();//和普通的bfs不一样,这里需要先把队头存起来,否则下面元素入队后因为是优先队列所以队头可能会发生变化 que.pop();//这里也要先将队头pop掉,因为优先队列可能会使队头元素发生改变 for(int i=0;i<4;i++){ tx=B.x+next[i][0]; ty=B.y+next[i][1]; if(tx<0||tx>=n||ty<0||ty>=m) continue; if(!book[tx][ty]){ book[tx][ty]=1; Q.x=tx,Q.y=ty; if(G[tx][ty]==G[B.x][B.y]) Q.cost=B.cost; else Q.cost=B.cost+1; que.push(Q); } if(tx==zx&&ty==zy){ ans=Q.cost; y=1; break; } } if(y) break; } printf("%d ",ans); } return 0; } /* 3 3 xyx xxx xyx 0 0 2 1 answer:1 */