您的位置:首页 > 大数据 > 人工智能

hdu 4308 Saving Princess claire_ 广搜 多校联合赛第七题

2012-07-21 20:31 435 查看
一个广搜题,就多了一个p点的处理,我们在以起点为开始广搜 遇见第一个p时(这个p一定是理起点最近的点)再将多有的p点都爆搜出来,压入队列,然后正常广搜就ok啦!!

5000*10000貌似没有超int啊!!wa了一次,改成longlong过了,测试数据有问题???

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
char a[5005][5005];
long long map[5005][5005];
int r,c,t,sx,sy,ex,ey,sum,sign;
int dir[4][2]={1,0,0,1,-1,0,0,-1};
void bfs(int x,int y){
queue<int> q;
q.push(x);
q.push(y);
while(!q.empty()){
int m=q.front();q.pop();
int n=q.front();q.pop();
for(int i=0;i<4;i++){
int mm=m+dir[i][1];
int nn=n+dir[i][0];
if(mm>=0&&mm<r&&nn>=0&&nn<c&&a[mm][nn]!='#'&&map[mm][nn]==0){
if(a[mm][nn]!='P'){
if(a[mm][nn]=='*'){
map[mm][nn]=map[m]
+t;
q.push(mm);
q.push(nn);
}
if(a[mm][nn]=='C'){
sign=1;//标记是否找到终点
map[mm][nn]=map[m]
;
return ;
}
}
else if(a[mm][nn]=='P'){
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
if(i==mm&&j==nn) continue;
if(a[i][j]=='P'){//搜索所有p点,加入队列,
a[i][j]='!';//防止第二次又搜到p点
q.push(i);
q.push(j);
map[i][j]=map[m]
;
}
}
}
}
}
}
}
}
int main(){
while(~scanf("%d%d%d",&r,&c,&t)){
for(int i=0;i<r;i++)
scanf("%s",a[i]);
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
map[i][j]=0;
if(a[i][j]=='Y'){
sx=i;sy=j;
}
if(a[i][j]=='C'){
ex=i;ey=j;
}
}
}
sign=0;
sum=0;
bfs(sx,sy);
if(sign==0) printf("Damn teoy!\n");
else cout<<map[ex][ey]<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: