题目
题解
这题用单纯的广搜能得到从起点到终点的最少步数,但费用却不一定是最小的,故需要在广搜的基础上加上优先队列解决。
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\n");
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\n",ans);
}
return 0;
}
/*
3 3
xyx
xxx
xyx
0 0 2 1
answer:1
*/