现在的位置: 首页 > 综合 > 正文

迷宫题

2017年11月21日 ⁄ 综合 ⁄ 共 1970字 ⁄ 字号 评论关闭

题意:给你一个迷宫,告诉你原点,然后求走出迷宫的最少花费。

感觉优先队列好神奇,本来是用dfs的,但是老是RE,但是用了优先队列就过了。

优先队列的使用格式大概是:

头文件:

#include <queue>

#include <vector>

#include <iostream>

using namespace std;

然后是命名:priority_que<int,vector<int>,cmp> q;

这里有比较函数:

struct cmp

{

bool operator()(int x,int y)

{   return XXXXXXX;}   //这里自己比较啦。拿什么东西比较都可以。

}

 其他思想差不多啦。每次都把四个方向还没有走过的格子放到队列里面去,然后每次用的时候取出队列中花费最小的那个队列,然后继续比较。

#include <stdio.h>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
#define maxn 1010
#define inf 0x3f3f3f3f
char map[maxn][maxn];
int mapp[maxn][maxn];
int vis[maxn][maxn];
int cho[4]={1,0,-1,0};
int choo[4]={0,1,0,-1};
int bl[maxn];
int ans;
int n,m,num;
int cos[maxn*maxn];
struct cmp
{
    bool operator()(int x,int y)
    {
        return cos[x]>cos[y];
    }
};

int min(int x,int y)
{
    if(x>y) return y;
    else return x;
}
void dfs(int x,int y,int sum)
{
    if(x==0||x==m-1||y==0||y==n-1) {ans=min(ans,sum);return;}
    int i,j,k;
    int tmp=inf,flag;
    for(i=0;i<4;i++)
    {
        int xx=x+cho[i];
        int yy=y+choo[i];
        if(!vis[xx][yy]&&tmp>mapp[xx][yy])
        {
            tmp=mapp[xx][yy];
            flag=i;
        }
    }
  //  printf("xx=%d  yy=%d\n",x+cho[flag],y+choo[flag]);
    vis[x+cho[flag]][y+choo[flag]]=1;
    dfs(x+cho[flag],y+choo[flag],sum+tmp);
}
void init()
{
    int i,j,k;
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
            {vis[i][j]=0;cos[i*n+j]=0;}
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        ans=inf;
        scanf("%d%d%d",&num,&n,&m);
      //  printf("num=%d\n",num);
        init();
        int i,j,k;
        for(i=0;i<num;i++)
        {
            char a;
            int b;
            getchar();
            scanf("%c %d",&a,&b);
            bl[a]=b;
     //       printf("%c   %d\n",a,b);
        }
        getchar();
        int inx,iny;
        for(i=0;i<m;i++)
            {
                gets(map[i]);
                for(j=0;j<n;j++)
                    {
                        if(map[i][j]=='E')
                        {vis[i][j]=1;inx=i;iny=j;}
                        mapp[i][j]=bl[map[i][j]];
                    }
            }


        //dfs(inx,iny,0);
        priority_queue<int, vector<int>, cmp> que;
        int inz=inx*n+iny;
        cos[inz]=0;
        que.push(inz);
        while(!que.empty())
        {
            int tmpz=que.top();
            que.pop();
            int x=tmpz/n,y=tmpz%n;
            //printf("????\n");
         //   printf("x=%d  y=%d\n",x,y);
            if(x==0||x==m-1||y==0||y==n-1) {ans=cos[tmpz];break;}
            for(i=0;i<4;i++)
            {
                int xx=x+cho[i],yy=y+choo[i];
                int zz=xx*n+yy;
                if(xx>-1&&xx<m&&y>-1&&y<n&&!vis[xx][yy])
                {
                    cos[zz]=cos[tmpz]+mapp[xx][yy];
               //     printf("***cos[zz]=%d\n",cos[zz]);
                    que.push(zz);
                    vis[xx][yy]=1;
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
【上篇】
【下篇】

抱歉!评论已关闭.