版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wulianwangxuchenqi/article/details/78585915
最少步数
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
4
- 描述
-
这有一个迷宫,有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,10表示道路,1表示墙。
现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?
(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
using namespace std;
struct node{
int x, y;
int step;
};
int a,b,c,d;
int dir[4][2]= {{0,1},{1,0},{0,-1},{-1,0}};
int bfs(int map[9][9]){
queue<node> q;
node f, s, e;
s.x = a;
s.y = b;
s.step = 0;
q.push(s);
while(!q.empty()){
//printf("111\n");
f = q.front();
q.pop();
//printf("%d %d\n", f.x, f.y);
if(f.x == c && f.y == d) return f.step;
for(int i = 0; i < 4; i++){
int xx = f.x+dir[i][0];
int yy = f.y+dir[i][1];
if(xx>=0&&xx<9&&yy>=0&&yy<9&&map[xx][yy]!=1){
e.x =xx;
e.y =yy;
e.step = f.step+1;
q.push(e);
map[xx][yy] = 1;
}
}
}
return -1;
}
int main(){
int n;
scanf("%d", &n);
while(n--){
scanf("%d%d%d%d", &a,&b,&c,&d);
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}
};
map[a][b] = 1;
cout << bfs(map) <<endl;
}
return 0;
}