这有一个迷宫,有0~8行和0~8列:
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
0表示道路,1表示墙。
现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?
(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)
2 3 1 5 7 3 1 6 7
12 11
思路:一道很普通的广搜,确实是太长时间没做了生疏了。需要注意的一点就是要考虑起点和终点相同的这种情况。
ac代码:
#include//二维数组的初始化需要放在定义的时候
#include//如果终点和起点一样步数应该为0.
#include
#define INF 0x3f3f3f
using namespace std;
struct node{
int x,y,t;
}a,temp;
int x1,y1,x2,y2,cx[4]={0,0,1,-1},cy[4]={-1,1,0,0},vis[10][10];
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 jud(int x,int y){
if(x<0&&x>8&&y<0&&y>8)
return 0;
if(map[x][y]==1||vis[x][y]==1)
return 0;
return 1;
}
void bfs(){
memset(vis,0,sizeof(vis));
queueq;
int ans=INF;
a.x=x1;
a.y=y1;
a.t=0;
vis[a.x][a.y]=1;
q.push(a);
while(!q.empty()){
a=q.front();
q.pop();
for(int i=0;i<4;i++){
temp.x=a.x+cx[i];
temp.y=a.y+cy[i];
temp.t=a.t+1;
if(jud(temp.x,temp.y)){
vis[temp.x][temp.y]=1;
if(temp.x==x2&&temp.y==y2)
if(ans>temp.t)
ans=temp.t;
q.push(temp);
}
}
}
printf("%d\n",ans);
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1==x2&&y1==y2)
printf("0\n");
else
bfs();
}
return 0;
}