BFS错一个点,刚转c++的萌新求助
  • 板块学术版
  • 楼主刘芝麻
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/7/16 16:49
  • 上次更新2023/11/6 23:01:13
查看原帖
BFS错一个点,刚转c++的萌新求助
208269
刘芝麻楼主2020/7/16 16:49

问题 C: 1逃出城堡

时间限制: 1 Sec 内存限制: 128 MB 提交: 28 解决: 44

[命题人:luping]

题目描述 羊羊们选出的代表不负重望,击败了骄傲的Jack。Jack恼羞成怒,违反了原则要抓小羊,情况紧急,羊羊们必须找到一条最短的路径逃出Jack的城堡。Jack的城堡是一个n*m的矩形,里面有一些地方可以通过(用0表示),有一些地方则为墙或障碍物(用1表示),无法通过,小羊们处于(x,y)处,出口在(n,m)处。可小羊们无法立刻求到这条路径,这时,善良而伟大的Yyz出现了,他给了羊羊们城堡的地图和一台笔记本电脑。羊羊们要通过这来求出到出口的最短路径。

输入 第1行,两个正整数n,m(n,m≤500),表示城堡的长和宽。

第2~n+1行,每行n个数字(0和1),表示此处城堡地形。

第n+2行,两个正整数x,y(x,y均不超过n,m),表示小羊所处位置。

输出

一行,一个数,表示最短路径的长度。

样例输入

6 5

0 0 1 0 1

1 0 0 0 0

1 1 0 1 0

0 0 0 1 0

1 0 1 1 0

1 0 0 0 0

2 2

样例输出

7 代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,i,j,ii,ans,c,v,q[1000000],p[1000000],h[2001][2001]; 
int a[2000][2000]; 
int b[4][2]={{0,-1},{0,1},{1,0},{-1,0}};
bool ff;
void bfs(int x,int y)
{
  int xx=0,yy=0,w=0,t=0,i=0;
  h[x][y]=0;
  q[1]=x; 
  p[1]=y;
  t=0;
  w=1;
  while (t<w)
    {
    	t++;
    	for (i=0;i<4;i++)
    	{
    		xx=q[t]+b[i][0];yy=p[t]+b[i][1];
    		if (h[xx][yy]>h[q[t]][p[t]]+1&&a[xx][yy]!=1) 
    		{
    			w++;
    			q[w]=xx;
				p[w]=yy;
				h[xx][yy]=h[q[t]][p[t]]+1;
				if (xx==c&&yy==v){printf("%d",h[xx][yy]);ff=true;return;}
			}
		}
	}	
	return;
}
int main()
{
	scanf("%d %d",&n,&m);
	for (i=1;i<=n;i++)
	  for (j=1;j<=m;j++)
		scanf("%d",&a[i][j]);
	for (i=1;i<=n;i++)
	  for (j=1;j<=m;j++)
	      h[i][j]=1e9;
	scanf("%d %d",&c,&v);
	bfs(n,m); 
	if (ff=false) printf("0");
return 0;
}

2020/7/16 16:49
加载中...