您的位置:首页 > 其它

HDU_4771_Stealing Harry Potter's Precious(BFS+DFS)(13杭州现场赛B题)

2014-02-13 17:43 435 查看
题型:搜索

题意:

n*m的地图中,“#”代表墙壁,“.”代表可到达区域,有k个宝物在地图中,问从“@”所在位置出发将k个宝物全部拿到的最短距离,无法全部拿到输出-1。

分析:

首先对所有的宝物包括“@”进行搜索,BFS出每个点到其他点的最短距离,由于k不超过4,所以从起点开始DFS暴搜出答案。

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int INF = 0x7f7f7f7f;
int n,m;
int k;
struct Node{
int x,y,step;
}p[10];
int dist[10][10];
bool map[105][105];
bool vis[105][105];
bool ok[10];
char str[105];
int dir1[]={0,0,1,-1};
int dir2[]={1,-1,0,0};

bool check(Node A){
if(map[A.x][A.y]==true&&vis[A.x][A.y]==false&&A.x>0&&A.x<=n&&A.y>0&&A.y<=m)
return true;
else return false;
}

int bfs(Node a,Node b){
memset(vis,false,sizeof(vis));
queue<Node> q;
q.push(a);
Node nv,nm;
while(!q.empty()){
nv=q.front();
q.pop();
for(int i=0;i<4;i++){
nm.x=nv.x+dir1[i];
nm.y=nv.y+dir2[i];
nm.step=nv.step+1;
if(check(nm)){
q.push(nm);
vis[nm.x][nm.y]=true;
}
if(nm.x==b.x && nm.y==b.y){
return nm.step;
}
}
}
return -1;
}
int ans,tmp;
void dfs(int now,int num){
if(num==k){
ans=min(ans,tmp);
return;
}
for(int i=1;i<=k;i++){
if(dist[now][i]==INF || ok[i]) continue;
tmp+=dist[now][i];
ok[i]=true;
dfs(i,num+1);
ok[i]=false;
tmp-=dist[now][i];
}
return;
}

int main(){
while(1){
scanf("%d%d",&n,&m);
if(n==0&&m==0) break;
memset(map,false,sizeof(map));
for(int i=1;i<=n;i++){
scanf("%s",str);
for(int j=0;j<m;j++){
if(str[j]!='#'){
map[i][j+1]=true;
}
if(str[j]=='@'){
p[0].x=i;
p[0].y=j+1;
p[0].step=0;
}
}
}
scanf("%d",&k);
for(int i=1;i<=k;i++){
scanf("%d%d",&p[i].x,&p[i].y);
p[i].step=0;
}

memset(dist,INF,sizeof(dist));

bool flag=true;
for(int i=0;i<=k;i++){
for(int j=0;j<=k;j++){
if(i!=j){
int tmp=bfs(p[i],p[j]);
if(tmp==-1){
flag=false;
break;
}
else{
dist[i][j]=min(dist[i][j],tmp);
}
}
}
}

if(!flag){
printf("-1\n");
continue;
}
memset(ok,false,sizeof(ok));
ans=INF;
tmp=0;
for(int i=0;i<=k;i++){
if(dist[0][i]==INF) continue;
tmp+=dist[0][i];
ok[i]=true;
dfs(i,1);
ok[i]=false;
tmp-=dist[0][i];
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: