D - Wizard in Maze
题目解释:简单来说就是有一个H*W的格子,你有两种走法:1.上下左右走 2.在5*5的格子里穿梭(消耗魔法)
问最少需要用多少魔法才能走到目标格子
双端队列
这题解法应该就是双端队列,能走方案1不走方案2 方案1放在队首,方案2放在队尾。
还请大佬帮我看一下我的程序到底哪里有问题?
#include <bits/stdc++.h>
using namespace std;
int h,w,sx,sy,ex,ey;
int main()
{
cin>>h>>w>>sx>>sy>>ex>>ey;
char a[h+2][w+2];
bool vis[h+2][w+2];//访问数组
int d[h+2][w+2];//用魔法的次数 d[i][j]表示走到(i,j)需要用的魔法次数
for(int i=1;i<=h;i++)
for(int j=1;j<=w;j++)
cin>>a[i][j];
deque<pair<int,int> > q;//双端队列
q.push_back(make_pair(sx,sy));//起始点入队
vis[sx][sy]=true;//标记已来过
d[sx][sy]=0;
while(!q.empty())
{
pair<int,int> fr=q.front();
int x=fr.first,y=fr.second;
if(x==ex&&y==ey);//如果
{
cout<<d[x][y]<<endl;
return 0;
}
vis[x][y]=true;
q.pop_front();//队首出列
for(int i=-2;i<=2;i++)//方案2的走法包含方案1,所以可以在一起处理
{
for(int j=-2;j<=2;j++)
{
int nx=x+i;
int ny=y+j;
if(nx<=h&&nx>=1 && ny<=w&&ny>=1 &&a[nx][ny]=='.')//判断是否可以走
{
if(vis[nx][ny]) continue;
vis[nx][ny]=true;
if(fabs(i)+fabs(j)<2)//说明是方案1
{
d[nx][ny]=d[x][y];//不消耗魔法
q.push_front(make_pair(nx,ny));//放在队首(方案1)
vis[i][j]=true;
}
else
{
if(d[x][y]+1<d[nx][ny]) //方案2,如果原先的走法加上1比现在用魔法方法要更优,那就更新一下
{
d[nx][ny]=d[x][y]+1;
q.push_back(make_pair(nx,ny));//放在队尾
}
}
}
}
}
}
cout<<"-1"<<endl;
return 0;
}
不知为何,程序一直爆0,本人只是一个小菜鸟,还望各位大佬指教一二。