多校第一场的搜索水题,广搜就可以过,搜到P的时候把所有的P都压入到队列里。用到了压缩坐标。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define N 5005
using namespace std;
struct node{
int p;
int step;
}lst,nxt,tmp;
char s[N],map[N];
int vis[N],start,end;
int dir[][2]={1,0,0,1,-1,0,0,-1};
int bfs(int r,int c){
int x,y;
queue<node>Q;
nxt.p=start,nxt.step=0;
vis[start]=1;
Q.push(nxt);
while(!Q.empty()){
lst=Q.front();
Q.pop();
//cout<<lst.p/c<<' '<<lst.p%c<<'\t'<<lst.step<<endl;
if(lst.p==end) return lst.step;
for(int i=0;i<4;i++){
x=lst.p/c+dir[i][0];
y=lst.p%c+dir[i][1];
//cout<<"x="<<x<<' '<<"y="<<y<<endl;
nxt.p=x*c+y;
if(0<=x&&x<r&&0<=y&&y<c&&!vis[nxt.p]){
//cout<<"Check nxt done!"<<endl;
if(map[x*c+y]=='P'){
for(int j=0;j<r*c;j++)
if(map[j]=='P'&&!vis[j]){
tmp.p=j,tmp.step=lst.step;
vis[tmp.p]=1;
Q.push(tmp);
//cout<<"Push tmp done!"<<endl;
}
}
else{
nxt.step=lst.step+1;
vis[nxt.p]=1;
Q.push(nxt);
//cout<<"Push nxt done!"<<endl;
}
}
}
}
return -1;
}
int main(){
freopen("in.in","r",stdin);
int r,c,v;
while(~scanf("%d%d%d",&r,&c,&v)){
int cnt=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<r;i++){
scanf("%s",s);
for(int j=0;j<c;j++){
map[i*c+j]=s[j];
if(s[j]=='Y') start=i*c+j;
if(s[j]=='C') end=i*c+j;
if(s[j]=='#') vis[i*c+j]=1;
}
}
//cout<<start<<' '<<end<<endl;
int ans=bfs(r,c);
if(ans!=-1) printf("%d\n",ans*v-v);
else printf("Damn teoy!\n");
}
return 0;
}