程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 1242 Rescue(優先隊列+bfs)

HDU 1242 Rescue(優先隊列+bfs)

編輯:C++入門知識

HDU 1242 Rescue(優先隊列+bfs)


題目地址:HDU 1242

這個題相比於普通的bfs有個特殊的地方,經過士兵時會額外消耗時間,也就是說此時最先搜到的時候不一定是用時最短的了。需要全部搜一遍才可以。這時候優先隊列的好處就顯現出來了。利用優先隊列,可以讓隊列中的元素按時間排序,讓先出來的總是時間短的,這樣的話,最先搜到的一定是時間短的,就不用全部搜一遍了。PS:我是為了學優先隊列做的這題。。不是為了這題而現學的優先隊列。。

代碼如下;

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include
using namespace std;
int vis[300][300], n, m;
char mp[300][300];
int jx[]={0,0,1,-1};
int jy[]={1,-1,0,0};
struct node
{
    int x, y, ans;
    bool operator<(const node &a) const{
    return ans>a.ans;
    }
};
void bfs(int x, int y)
{
    memset(vis,0,sizeof(vis));
    priority_queueq;
    node f1, f2;
    f1.x=x;
    f1.y=y;
    f1.ans=0;
    q.push(f1);
    vis[x][y]=1;
    while(!q.empty())
    {
        f1=q.top();
        q.pop();
        if(mp[f1.x][f1.y]=='r')
        {
            printf("%d\n",f1.ans);
            return ;
        }
        for(int i=0;i<4;i++)
        {
            f2.x=f1.x+jx[i];
            f2.y=f1.y+jy[i];
            if(f2.x>=0&&f2.x=0&&f2.y

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved