版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/foreverzili/article/details/79842520
最少步数
时间限制:
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)。)
- 输入
-
第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。 - 输出
- 输出最少走几步。
- 样例输入
-
2 3 1 5 7 3 1 6 7
- 样例输出
-
12 11
- 来源
- [苗栋栋]原创
- 上传者
题目链接
AC 代码:
#include<cstdio>
#include<utility>
#include<queue>
using namespace std;
//用于存储状态(坐标)
typedef pair<int , int> P;
const int INF = 1000;
bool maze[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};
//记录从起点到终点的距离,初始化为INF
int d[10][10];
int ex, ey;
int sx, sy;
//上 右 下 左
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
int bfs(){
for(int i = 0; i < 10; i++)
for(int j = 0; j< 10; j++){
d[i][j]=INF;
}
queue<P> Q;
d[sx][sy]=0;
Q.push(P(sx, sy));
while(!Q.empty())
{
P p = Q.front();
Q.pop();
//到达终点,结束循环
if(p.first==ex&&p.second==ey){
break;
}
//向四个方向搜索
for(int i =0; i < 4; i++){
int row = p.first + dx[i];
int col = p.second + dy[i];
//判断是否可以移动及是否已经访问过
if(row >= 0 && row < 9 && col >= 0 && col < 9 && maze[row][col] == 0 && d[row][col]==INF){
Q.push(P(row, col));
d[row][col] = d[p.first][p.second] + 1;
// printf("%d %d\n",row, col);
}
}
}
//返回起点到终点的距离
return d[ex][ey];
}
int main(){
int n;
scanf("%d", &n);
while(n--){
scanf("%d%d%d%d",&sx, &sy, &ex, &ey);
printf("%d\n",bfs());
}
return 0;
}