nyoj 1022 最少步数【优先队列+广搜】
2015-06-17 13:18
232 查看
最少步数
时间限制: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
#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; }
相关文章推荐
- Android开发笔记—— layout_weight
- 推荐算法:协同过滤算法的介绍
- 最简单的基于Flash的流媒体示例:网页播放器(HTTP,RTMP,HLS)
- Android实战简易教程-第十九枪(SwipeRefreshLayout下拉刷新使用实例)
- ASP:当 request.cookies 发生 Microsoft VBScript 运行时错误 (0x800A000D) 类型不匹配: '[string:
- axis2集成到已有项目操作实例(含源代码)
- UIViewContentMode各类型效果
- mybatis+springmvc缓存设置
- period task
- 黑马程序员-----css层叠样式表
- Linus进程间通信(一)管道、命名管道的原理及实现
- xquery
- 【插入排序】直接,折半,二路,希尔
- Jquery 获得单选按钮组中选中的值
- 收藏:解决其它程序与IIS共享80端口的四个方法
- 欢迎使用CSDN-markdown编辑器
- 黑马程序员----Java基础之集合类(一)
- conjugate gradient method (共轭梯度法)
- GCD 只执行一次
- Java:在不同界面样式下JPopupMenu与鼠标事件mousePressed表现的结果不同!