13杭州现场赛Stealing Harry Potter's Precious(bfs+dfs)
2014-05-07 17:07
459 查看
题意:一个简单图,给你一个起点,图中最多有4个宝藏,问你收集这四个宝藏最多要多少步.
解题思路:很简单的一个题,因为宝藏比较少,所以先对宝藏进行一个全排,然后再一步一步算步数.
解题代码:
View Code
解题思路:很简单的一个题,因为宝藏比较少,所以先对宝藏进行一个全排,然后再一步一步算步数.
解题代码:
// File Name: d.cpp // Author: darkdream // Created Time: 2014年05月06日 星期二 19时03分57秒 #include<vector> #include<set> #include<deque> #include<stack> #include<bitset> #include<algorithm> #include<functional> #include<numeric> #include<utility> #include<sstream> #include<iostream> #include<iomanip> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<ctime> using namespace std; int n , m; struct node{ int x, y ,s; }LIST[10005]; int visit[104][104]; int MAP[104][104]; struct node1{ int x, y ; }a[10]; int xadd[] = {0,0,1,-1}; int yadd[] = {1,-1,0,0}; int ok = 1; int bfs(int bx, int by ,int ex,int ey) { //printf("%d %d %d %d\n",bx,by,ex,ey); LIST[1].x = bx ; LIST[1].y = by ; LIST[1].s = 0 ; int l = 1, r= 1; int tempok = 0 ; memset(visit,0,sizeof(visit)); visit[bx][by] = 1; while(l <= r ) { // printf("%d %d\n",LIST[l].x,LIST[l].y); if(LIST[l].x == ex && LIST[l].y == ey) { tempok = 1; break; } for(int i = 0 ; i <= 3;i ++) { int tempx = LIST[l].x + xadd[i]; int tempy = LIST[l].y + yadd[i]; if(!visit[tempx][tempy] && MAP[tempx][tempy]) { visit[tempx][tempy] = 1; r ++ ; LIST[r].x = tempx; LIST[r].y = tempy; LIST[r].s = LIST[l].s +1 ; } } l ++; } if(tempok == 0) ok = 0; else return LIST[l].s; } int main(){ while(scanf("%d %d",&n,&m) != EOF) { if(n == 0 && m == 0) break; memset(MAP,0,sizeof(MAP)); memset(a,0,sizeof(a)); for(int i = 1;i <= n;i ++) { char str[104]; scanf("%s",&str[1]); for(int j = 1;j <= m;j ++) { if(str[j] == '#') { } else { MAP[i][j] = 1; if(str[j] == '@') { a[0].x = i ; a[0].y = j; } } } } int k ; scanf("%d",&k); for(int i = 1;i <= k;i ++) scanf("%d %d",&a[i].x,&a[i].y); int temp[6]; for(int i =0 ;i < k;i ++) temp[i] = i + 1; ok = 1; int min = 1000000; do{ int last = 0; int sum = 0 ; for(int i = 0 ;i < k ;i ++) { sum += bfs(a[last].x,a[last].y,a[temp[i]].x,a[temp[i]].y); last = temp[i]; } if (sum <= min) min = sum; // printf("%d\n",sum); }while(next_permutation(temp,temp+k)); if(ok == 0 ) printf("-1\n"); else printf("%d\n",min); } return 0 ; }
View Code
相关文章推荐
- HDU_4771_Stealing Harry Potter's Precious(BFS+DFS)(13杭州现场赛B题)
- hdu 4770 13 杭州 现场 A - Lights Against Dudely 暴力 bfs 状态压缩DP 难度:1
- hdu 4771 13 杭州 现场 B - Stealing Harry Potter's Precious 暴力bfs 难度:0
- hdu 4771 Stealing Harry Potter's Precious (2013亚洲区杭州现场赛)(搜索 bfs + dfs) 带权值的路径
- hdu 4771 Stealing Harry Potter's Precious (2013 杭州 onsite B题)bfs预处理后,dfs枚举或tsp
- 牛客练习赛13 幸运数字Ⅱ(BFS,DFS,二分,思路)
- HDU 4771 Stealing Harry Potter's Precious (BFS)2013杭州现场赛
- 13杭州区域赛现场赛Rabbit Kingdom(树状数组+离线)
- Ch4-2: find if 2 given vertices are connected in a directed map,BFS + JUST fix the DFS recursion
- bfs,dfs
- java实现邻接表图、DFS、BFS
- dfs和bfs 变形课
- 深度优先搜索(DFS)与广度优先搜索(BFS)
- hdu 4771 Stealing Harry Potter's Precious(DFS+BFS)
- HDU-1175 连连看(BFS 或 DFS)
- C语言实现图的邻接矩阵和BFS DFS
- hdu 4771 Stealing Harry Potter's Precious(bfs+dfs)
- leetcode -- Remove Invalid Parentheses--又是DFS,BFS的题目
- nyoj 最少步数(BFS,DFS)
- 自己动手实现图的BFS和DFS(附完整源码)