最少步数
时间限制:
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
代码如下:
#include <iostream> #include <cstring> #include <queue> using namespace std; int fx[4]={1,-1,0,0},fy[4]={0,0,1,-1}; int m[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[9][9];//建立一个2维数组,防止广搜的重复搜索! struct dkr { int x,y,step; }; queue <dkr> v; int bfs(int a,int b,int c,int d) { dkr L,p,q; L.x=a;L.y=b;L.step=0; v.push(L);//建立初始节点 while(!v.empty()) { p=v.front(); v.pop(); if(p.x==c&&p.y==d) return p.step; for(int i=0;i<4;i++) { q.x=p.x+fx[i];q.y=p.y+fy[i]; if(q.x>=0&&q.x<=8&&q.y>=0&&q.y<=8&&m[q.x][q.y]==0&&map[q.x][q.y]==0) { q.step=p.step+1; map[q.x][q.y]=1; v.push(q); } } } } int main() { int n; cin>>n; while(n--) { memset(map,0,sizeof(map)); int a,b,c,d; cin>>a>>b>>c>>d; cout<<bfs(a,b,c,d)<<endl; while(!v.empty()) v.pop(); } return 0; }
欢迎指教,吐槽,鄙视,但请留下更优方法!不胜感激!!!
-
第一行输入一个整数n(0<n<=100),表示有n组测试数据;