最少步数
时间限制: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,1
0表示道路,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<stdio.h> #include<string.h> #include<queue> #define mem(a) memset(a,0,sizeof(a)) using namespace std; typedef struct{ int x,y; int step; }node; node begin,end; int visit[1000100]; int b[2][4]={0,1,0,-1,1,0,-1,0};//前进的横纵坐标变化 int hash(node u) { return u.x*100+u.y;//标记 该节点 } int find(node u,node v) { return u.x==v.x&&u.y==v.y; } int main() { int i,j; int t; scanf("%d",&t); while(t--) { mem(visit); 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 }; scanf("%d%d",&begin.x,&begin.y); begin.step=0; scanf("%d%d",&end.x,&end.y); queue<node>q; q.push(begin); visit[hash(begin)]=1; map[begin.x][begin.y]=1; while(!q.empty()) { node u=q.front(); q.pop(); if(find(u,end)) { printf("%d\n",u.step); break; } for(int i=0;i<4;++i) { if(map[u.x+b[0][i]][u.y+b[1][i]]==0) { map[u.x+b[0][i]][u.y+b[1][i]]=1; node v=u; v.x+=b[0][i]; v.y+=b[1][i]; v.step++; if(!visit[hash(v)]) { visit[hash(v)]=1; q.push(v); } } } } while(!q.empty()) q.pop(); } return 0; }
时间: 2024-10-12 21:14:58