看书的时候碰到了优先队列这个词,感觉很熟悉,但是具体怎么实现的又忘了。。

又翻开以前写的代码,写成下面这个模板。

体验喀斯特地貌

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;
}


posted on 2011-03-22 17:26  奋斗青春  阅读(286)  评论(0编辑  收藏  举报