hdu 4308 Saving Princess claire_ BFS

为了准备算法考试刷的,想明确一点即可,全部的传送门相当于一个点,当遇到一个传送门的时候,把全部的传送门都压入队列进行搜索


贴代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;

const int MAXN = 5000+50;
int r,c,f,si,sj,ei,ej,ans;
int mat[MAXN][MAXN];

struct Node
{
    Node(int i=0,int j=0,int v=0){x=i;y=j;val=v;}
    int x,y;
    int val;
};

int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//left up down right

void init()
{
    char cc;
    ans=-1;
    getchar();
    for(int i=0;i<r;i++)
    {
        for(int j=0;j<c;j++)
        {
            cc=getchar();   //putchar(cc);
            if(cc == 'Y'){mat[i][j]=2;si=i,sj=j;continue;}
            if(cc == 'C'){mat[i][j]=3;ei=i;ej=j;continue;}
            if(cc == '*'){mat[i][j]=0;continue;}
            if(cc == '#'){mat[i][j]=-1;continue;}
            if(cc == 'P'){mat[i][j]=1;continue;}
        }
        getchar();
    }
}

int legal(Node &s)
{
    if(s.x>=0 && s.y>=0 && s.x<r && s.y <c)
        return 1;
    return 0;
}

int bfs()
{
    queue<Node>q;
    Node st(si,sj),e;
    q.push(st);
    mat[si][sj]=-2;
    while(!q.empty())
    {
        st=q.front();
        //if(mat[st.x][st.y]==3)return st.val;  chao sha bi
        if(st.x==ei && st.y == ej)return st.val;
        q.pop();
        for(int k=0;k<4;k++)
        {
            e.x=st.x+dir[k][0];
            e.y=st.y+dir[k][1];
            e.val=st.val;
            if(legal(e) && mat[e.x][e.y]>=0 && mat[e.x][e.y]!=2)
            {
                if(!mat[e.x][e.y])//*
                {
                    e.val=st.val+f;
                    q.push(e);
                }
                if(mat[e.x][e.y]==1)
                {
                    for(int ii=0;ii<r;ii++)
                    {
                        for(int jj=0;jj<c;jj++)
                        {
                            if(mat[ii][jj]==1)
                            {
                                mat[ii][jj]=-2;
                                q.push(Node(ii,jj,e.val));
                            }

                        }
                    }
                }
               if(mat[e.x][e.y]>1)q.push(e);
                mat[e.x][e.y]=-2;
            }
        }

    }
    return -1;
}
int main()
{
    //freopen("hdu4038.txt","r",stdin);
    while(scanf("%d%d%d",&r,&c,&f)!=EOF)
    {
        init();
        ans=bfs();
        if(ans == -1)printf("Damn teoy!
");
        else
            printf("%d
",ans);
    }
    return 0;
}


原文地址:https://www.cnblogs.com/mfrbuaa/p/3995436.html