为了准备算法考试刷的,想明确一点即可,全部的传送门相当于一个点,当遇到一个传送门的时候,把全部的传送门都压入队列进行搜索
贴代码:
#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!\n");
else
printf("%d\n",ans);
}
return 0;
}