最少步数
时间限制: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
- 第一行输入一个整数n(0<n<=100),表示有n组测试数据;
AC源码:
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
int mat[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
};
struct node{
int x, y;
int step;
};
// 上下左右
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
int visited[9][9];
int bfs(node start, node end){
/*
*广度优先遍历算法*
1. 当前节点先入队列,队列不为空
2. 遍历当前节点可能出现的情况,进入队列,当前结点弹出队列,已经访问完 访问完就弹出,找到目标结点就结束,最终的step在目标结点上
*/
start.step = 0;
queue<struct node> q;
q.push(start);
visited[start.x][start.y] =1;
node a = start;
while(!q.empty()){
a = q.front();
if(a.x == end.x && a.y == end.y) break;// 跳出循环的条件
q.pop(); //访问完了弹出
for(int i = 0; i < 4; i++){
int xtemp =a.x+dx[i];
int ytemp =a.y+dy[i];
if(xtemp>=0 &&xtemp<=8&&ytemp>=0 &&ytemp<=8&&!visited[xtemp][ytemp]&&!mat[xtemp][ytemp]){
visited[xtemp][ytemp] = 1;
node tempNode ;
tempNode.x = xtemp;
tempNode.y = ytemp;
tempNode.step = a.step+1;
q.push(tempNode);
}
}
}
return a.step;
}
int main(){
int cases;
node start, end;
while(cin>>cases){
for(int i = 0; i< cases; i++){
memset(visited,0, sizeof(visited));
cin>>start.x>>start.y>>end.x>>end.y;
// 广度优先遍历
int steps = bfs(start, end);
cout<<steps<<endl;
}
}
return 0;
}