HDU_4771_Stealing Harry Potter's Precious(BFS+DFS)(13杭州现场赛B题)
2014-02-13 17:43
495 查看
题型:搜索
题意:
n*m的地图中,“#”代表墙壁,“.”代表可到达区域,有k个宝物在地图中,问从“@”所在位置出发将k个宝物全部拿到的最短距离,无法全部拿到输出-1。
分析:
首先对所有的宝物包括“@”进行搜索,BFS出每个点到其他点的最短距离,由于k不超过4,所以从起点开始DFS暴搜出答案。
代码:
题意:
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; }
相关文章推荐
- hdu 4771 Stealing Harry Potter's Precious (2013亚洲区杭州现场赛)(搜索 bfs + dfs) 带权值的路径
- hdu 4771 13 杭州 现场 B - Stealing Harry Potter's Precious 暴力bfs 难度:0
- 13杭州现场赛Stealing Harry Potter's Precious(bfs+dfs)
- hdu 4771 Stealing Harry Potter's Precious (2013 杭州 onsite B题)bfs预处理后,dfs枚举或tsp
- hdu 4770 13 杭州 现场 A - Lights Against Dudely 暴力 bfs 状态压缩DP 难度:1
- HDU 4771 Stealing Harry Potter's Precious (BFS)2013杭州现场赛
- hdu 4771 Stealing Harry Potter's Precious(DFS+BFS)
- hdu 4771 Stealing Harry Potter's Precious(BFS+DFS)
- hdu 4771 Stealing Harry Potter's Precious(DFS+BFS)
- hdu 4771 Stealing Harry Potter's Precious(DFS+BFS)
- HDU 4771 Stealing Harry Potter's Precious(bfs+dfs)
- hdu 4771 Stealing Harry Potter's Precious(DFS+BFS)
- hdu 4771 Stealing Harry Potter's Precious(DFS+BFS)
- hdu 4771 Stealing Harry Potter's Precious(DFS+BFS)
- hdu 4771 Stealing Harry Potter's Precious(DFS+BFS)
- hdu 4771 Stealing Harry Potter's Precious(bfs+dfs)
- hdu 4771 Stealing Harry Potter's Precious(DFS+BFS)
- hdu 4771 Stealing Harry Potter's Precious(DFS+BFS)
- hdu 4771 求一点遍历所有给定点的最短路(bfs+dfs)
- hdu 4771 Stealing Harry Potter's Precious(DFS+BFS)