AtCoder 176 D 求各位大佬帮忙

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,本人只是一个小菜鸟,还望各位大佬指教一二。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值