看书的时候碰到了优先队列这个词,感觉很熟悉,但是具体怎么实现的又忘了。。
又翻开以前写的代码,写成下面这个模板。
体验喀斯特地貌
Time Limit:1000MS Memory Limit:65536K
Total Submit:40 Accepted:13
Description
一次张mm去广西旅行,看到了喀斯特地貌,非常兴奋!他想走进里面一饱眼福,可是呢地面高低不平,他想找一条从进口到出口难度和最小的路,你能帮助他吗?
为了使问题简单,我们用一个正方形网格来表示景区的地貌,每个网格里有一个高度值,而且他只能从一个网格向左,右,上,下四个方向走,而且难度定义为所在网格的高度值和将要到的网格高度值的差值。而且你也知道张mm比较懒,当难度超过220时他就不会往将要走的网格走。到无路可走时张mm将返回。一开始张mm在第一行第一列的网格,如张mm能够到达出口(出口为第n行n列的网格,即右下角),请计算出到达出口的最小的难度和,如果不能到达出口输出-1即可。
Input
第一行输入一个整数t(t<10),表示有t组测试实例。
接下来有t组实例。
每组实例第一行输入一个整数n(0<N
接下来是n行n列个整数v(0<V
Output
每组实例输出其对应的难度和,无路可走输出-1。每组实例占一行。
Sample Input
2
3
1 2 3
4 1 1
5 6 1
3
1 500 1
500 1 0
1 1 1
Sample Output
2
-1
这时我们oj上的一道题,不知到老师是从什么地方找的。。
入队:Q.push(start);
访问对顶:cur=Q.top();
删除对顶:Q.pop();
判断队列是否为空:Q.empty();(当为空时,返回1;)
这些都包含在头文件
# include<queue>中;
下面把上面那题的代码贴出来:
# include<stdio.h>
# include<stdio.h>
# include<string.h>
# include<queue>
# define max 0x7fffffff
# define N 435
using namespace std;
struct node{
int x,y;
int val;
/*bool operator < (const node &a) const {
return a.val < val; //优先访问队列中val较小的
}*/
bool friend operator(const node a, const node b)
{
return a.val > b.val;//优先访问队列中val较小者,这点与qsort排序不太相同
}
};
int map[N][N],tir[N][N];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int n;
void BFS()
{
priority_queue<node> qu;
node start, cur, next;
start.x = 0;
start.y = 0;
start.val = 0;
qu.push(start);
while(!qu.empty())
{
cur=qu.top();
qu.pop();
for(int i=0;i<=3;i++)
{
next.x=cur.x+dir[i][0];
next.y=cur.y+dir[i][1];
if(next.x>=0 && next.x<n && next.y>=0 && next.y<n && abs(map[next.x][next.y]-map[cur.x][cur.y])<=220)
{
next.val=cur.val+abs(map[next.x][next.y]-map[cur.x][cur.y]);
if(next.val<tir[next.x][next.y]) {tir[next.x][next.y]=next.val; qu.push(next);}
}
}
}
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
scanf("%d",&map[i][j]);
tir[i][j]=max;
}
BFS();
if(tir[n-1][n-1]==max) printf("-1\n");
else printf("%d\n",tir[n-1][n-1]);
}
return 0;
}