nyoj 1022 最少步数【优先队列+广搜】
最少步数
时间限制: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<stdio.h> #include<string.h> #include<queue> using namespace std; int visit[9][9]; 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, }; struct node { int x; int y; int step; friend bool operator <(node a,node b)//结构体设置优先队列优先级 { return a.step>b.step;//步数小的先出队列 } }; void bfs(int x1,int y1,int x2,int y2) { int ok=0,i,k; int move[4][2]={0,-1,0,1,-1,0,1,0};//用以在四个方向上的移动 node begin,end;//定义结构体变量 priority_queue<node>q;//设置一个结构体的优先队列 begin.x=x1; begin.y=y1; begin.step=0; q.push(begin);//进队 while(!q.empty())//判断队列是否为空 如果不为空(即不到终点)则一直循环 { end=q.top(); q.pop();//删除队首元素 if(end.x==x2&&end.y==y2)//判断是否搜索到终点 { ok=1; break; } for(i=0;i<4;i++)//对此点四个方向进行搜索 { begin.x=end.x+move[i][0]; begin.y=end.y+move[i][1]; if(!visit[begin.x][begin.y]&&0<=begin.x&&begin.x<9&&0<=begin.y&&begin.y<9&&map[begin.x][begin.y]==0) {//判断路是否通并且判断当前点是否在题目所给的范围内 visit[begin.x][begin.y]=1; begin.step=end.step+1;//步数加一 q.push(begin);//将最小步数的一组放入队首 } } } if(ok) printf("%d\n",end.step); else printf("-1\n"); } int main() { int n,m,j,i,s,t,x1,y1,x2,y2; scanf("%d",&n); while(n--) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); memset(visit,0,sizeof(visit)); bfs(x1,y1,x2,y2); } return 0; }