为了准备算法考试刷的,想明白一点就行,所有的传送门相当于一个点,当遇到一个传送门的时候,把所有的传送门都压入队列进行搜索
贴代码:
#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; }
hdu 4308 Saving Princess claire_ BFS
时间: 2024-11-05 14:38:14