最少步数,广搜

这个题,需要处理的细节太多了

框架5,6分钟就写好了,然后开始各种报错

处理细节大概花了3个小时

 

 

 

 

 

 

#include<iostream>
#include<stdio.h>
#include<queue>
#include<cstring>
using namespace std;
struct node
{
int x;
int y;
int step;
};
queue<node>Q;
int f[4][2]={0,-1,0,1,-1,0,1,0};
int map[9][9]=
{
1,1,1,1,1,1,1,1,1,
1,0,0,1,0,0,1,0,1,
1,0,0,1,1,0,0,0,1,
1,0,1,0,1,1,0,1,1,
1,0,0,0,0,1,0,0,1,
1,1,0,1,0,1,0,0,1,
1,1,0,1,0,1,0,0,1,
1,1,0,1,0,0,0,0,1,
1,1,1,1,1,1,1,1,1
};
int bfs(int x1,int y1,int x2,int y2)
{
int a[9][9];
memset(a,0,sizeof(a));    

/*坑点之一,每次处理过一组数据之后,都要重新把a数组初始化,

(否则就会出现,只有第一组数据,是对的,后边的都会报错,这样a数组就失去了它存在的价值)*/
int x,y;
node q;
q.x=x1;
q.y=y1;
q.step=0;
Q.push(q);
a[x1][y1]=1;
while(!Q.empty())
{
q=Q.front();
if(q.x==x2&&q.y==y2)
{
break;
}

/*这个if 不能直接在if里边直接return q.step

因为,如果终点是‘1’,就会无法输出*/
Q.pop();
for(int i=0;i<4;i++)
{
x=q.x+f[i][0];
y=q.y+f[i][1];
if(x>=0&&x<9&&y>=0&&y<9&&a[x][y]==0&&map[x][y]==0)
{
node e={x,y,q.step+1};
Q.push(e);
a[x][y]=1;
}
}

}
if(Q.empty())
return -1;

/*这个if就是用来处理 刚刚那个if所不能处理的情况*/
while(!Q.empty())
Q.pop();

/*清空队列,为下次的调用

我第一次就是没有清空,导致下一次的输出比实际大*/
return q.step;
}
int main()
{
int T,x1,y1,x2,y2;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
int L=bfs(x1,y1,x2,y2);
printf("%d\n",L);
}
return 0;
}

posted @ 2017-03-03 15:45  飞起的小田  阅读(279)  评论(0编辑  收藏  举报