HDU 4771 (DFS+BFS)
2015-10-27 23:28
375 查看
[align=left]Problem Description[/align]
Harry Potter has some precious. For example, his invisible robe, his wand and his owl. When Hogwarts school is in holiday, Harry Potter has to go back to uncle Vernon's home. But he can't bring his precious with him. As you know, uncle Vernon never allows such magic things in his house. So Harry has to deposit his precious in the Gringotts Wizarding Bank which is owned by some goblins. The bank can be considered as a N × M grid consisting of N × M rooms. Each room has a coordinate. The coordinates of the upper-left room is (1,1) , the down-right room is (N,M) and the room below the upper-left room is (2,1)..... A 3×4 bank grid is shown below:
View Code
Harry Potter has some precious. For example, his invisible robe, his wand and his owl. When Hogwarts school is in holiday, Harry Potter has to go back to uncle Vernon's home. But he can't bring his precious with him. As you know, uncle Vernon never allows such magic things in his house. So Harry has to deposit his precious in the Gringotts Wizarding Bank which is owned by some goblins. The bank can be considered as a N × M grid consisting of N × M rooms. Each room has a coordinate. The coordinates of the upper-left room is (1,1) , the down-right room is (N,M) and the room below the upper-left room is (2,1)..... A 3×4 bank grid is shown below:
#include<bits/stdc++.h> using namespace std; char a[105][105]; int mp[105][105]; map<int,int>flag; int mpp[105][105]; int shorpath[6][2]; int dis[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int n,m; int k; int s_x,s_y; int parent[30]; int jishu=0; int A[6][6]; int re=100000; int sum; struct node { int x; int y; int step; }; int Find(int n) { if(n!=parent ) n=Find(parent ); return n; } void unio( int ss,int bb) { ss=Find(ss); bb=Find(bb); if(ss!=bb) parent[ss]=bb; } queue<node>q; node N,now; void init_() { for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) mpp[i][j]=mp[i][j]; } int bfs(int a,int b,int c,int d) { init_(); while(!q.empty()) { q.pop(); } N.x=a; N.y=b; N.step=0; q.push(N); mpp[a][b]=0; while(!q.empty()) { now=q.front(); q.pop(); if(now.x==c&&now.y==d) return now.step; for(int i=0;i<4;i++) { int aa=now.x+dis[i][0]; int bb=now.y+dis[i][1]; if(aa>0&&aa<=n&&bb>0&&bb<=m&&mpp[aa][bb]) { mpp[aa][bb]=0; N.x=aa; N.y=bb; N.step=now.step+1; q.push(N); } } } return -1; } void init() { for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) mp[i][j]=0; for(int i=0;i<=30;i++) parent[i]=i; re=100000; } /*void kruskal() { int re=0; for(int i=0;i<jishu;i++) { int qq=A[i].s; int ww=A[i].e; //cout<<re<<endl; if(Find(qq)!=Find(ww)) { unio(qq,ww); re+=A[i].x; } } printf("%d\n",re); }*/ void dfs(int n,int ce) { if(ce==k) { if(sum<re) { re=sum; } //printf("%d\n",re); return ; } for(int i=0;i<=k;i++) { if(i!=n&&flag[i]==0) { sum+=A [i]; flag[i]=1; dfs(i,ce+1); sum-=A [i]; flag[i]=0; } } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; init(); getchar(); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%c",&a[i][j]); if(a[i][j]=='@') { s_x=i; s_y=j; } if(a[i][j]=='.'||a[i][j]=='@') mp[i][j]=1; } getchar(); } scanf("%d",&k); shorpath[0][0]=s_x; shorpath[0][1]=s_y; for(int i=1;i<=k;i++) scanf("%d%d",&shorpath[i][0],&shorpath[i][1]); jishu=0; for(int i=0;i<=k;i++) for(int j=0;j<=k;j++) { A[i][j]=bfs(shorpath[i][0],shorpath[i][1],shorpath[j][0],shorpath[j][1]); } sum=0; flag[0]=1; dfs(0,0); printf("%d\n",re); } return 0; }
View Code
相关文章推荐
- GET请求和POST请求剖析
- 全局函数的Result一定要每次都初始化,否则上次的结果会被保持到下一次继续使用
- GitHub
- Newtonsoft.Json高级用法
- 自定义Animation动画,完成跑圈动作
- 从头认识java-4.7 构造器初始化(3)
- mysql创建数据库实例和导入数据
- Scala教程(十五)Scala的特性逆变与协变
- DrawerLayout的使用例子
- 从头认识java-4.7 构造器初始化(3)
- 同余问题(2)逆元,孙子定理
- 利用bigDecimal直接截取小数位数
- JXL导入导出Excel到数据库
- dubbo 学习(4) 集群容错模式和负载均衡模式
- MyBatis学习总结2
- 心沉下来了,一步步走
- Linux shell流程控制
- Codeforces Round #327 (Div. 2)——C. Median Smoothing
- leetcode刷题,总结,记录,备忘 173
- 移动端 css/html (box-flex)自适应、等比布局