首页 > 代码库 > HDU Collect More Jewels 1044
HDU Collect More Jewels 1044
BFS + 状态压缩 险过 这个并不是最好的算法 但是写起来比较简单 , 可以AC,但是耗时比较多
下面是代码 就不多说了
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue>using namespace std; #define Max(a,b) (a>b?a:b)#define Min(a,b) (a>b?a:b)#define maxn 100int m, n, time, k, sorce[20];bool vis[1<<11][51][51];char map[52][52];typedef struct{ int step; int x, y; int sorce; int stau;}Point;int bfs(Point P);int main(){ int i, j, T, ans, count = 1; Point P; scanf("%d",&T); while(T--) { scanf("%d%d%d%d",&n,&m,&time,&k); for(i=0; i<k; i++) scanf("%d",&sorce[i]); for(i=0; i<m; i++) { scanf("%s",map[i]); for(j=0; j < n; j++) { if(map[i][j] == ‘@‘) P.x = i, P.y = j, P.step = P.sorce = P.stau = 0; } } ans = bfs(P); printf("Case %d:\n",count++); if(ans == -1) printf("Impossible\n"); else printf("The best score is %d.\n",ans); if(T) printf("\n"); } return 0;}int bfs(Point P){ int i, max = -1, key; int dir[4][2] = {1,0,0,1,-1,0,0,-1}; Point Pn; queue <Point> q; q.push(P); memset(vis,0,sizeof(vis)); vis[P.stau][P.x][P.y] = 1; while( !q.empty() ) { P = q.front(); q.pop(); for(i=0; i<4; i++) { Pn.x = P.x + dir[i][0]; Pn.y = P.y + dir[i][1]; Pn.step = P.step + 1; Pn.sorce = P.sorce; Pn.stau = P.stau; if(Pn.step > time) break; if(Pn.x>=0 && Pn.x<m && Pn.y>=0 && Pn.y<n && map[Pn.x][Pn.y] != ‘*‘) { if(map[Pn.x][Pn.y] == ‘<‘) { max = Max(max,Pn.sorce); if(Pn.stau == ((1<<k)-1) ) return max; } else if(map[Pn.x][Pn.y] >= ‘A‘ && map[Pn.x][Pn.y] <= ‘J‘) { key = map[Pn.x][Pn.y] - ‘A‘; if( ((Pn.stau)&(1<<key)) == 0 ) { Pn.sorce += sorce[key]; Pn.stau += 1<<key; } } if( !vis[Pn.stau][Pn.x][Pn.y]) { vis[Pn.stau][Pn.x][Pn.y] = 1; q.push(Pn); } } } } return max;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。