HDU 4771 Stealing Harry Potter's Precious [BFS]
2015-11-08 17:17
429 查看
题意:给出一个N*M图, '.' 表示可以走的位置 ‘@’表示起点,还有一些藏宝地点,问你走遍所有藏宝地点的最短路程和,如果不能拿到所有宝藏,输出-1
范围:N,M<=100,藏宝地点小于4个
解法:直接BFS即可,BFS的同时需要记录到达每个点的状态:即已经获得了几个宝藏,因为状态至多16个,所以复杂度是16*n*m
代码:
范围:N,M<=100,藏宝地点小于4个
解法:直接BFS即可,BFS的同时需要记录到达每个点的状态:即已经获得了几个宝藏,因为状态至多16个,所以复杂度是16*n*m
代码:
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<iostream> #include<stdlib.h> #include<set> #include<map> #include<queue> #include<vector> #include<bitset> #pragma comment(linker, "/STACK:1024000000,1024000000") template <class T> bool scanff(T &ret){ //Faster Input char c; int sgn; T bit=0.1; if(c=getchar(),c==EOF) return 0; while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar(); sgn=(c=='-')?-1:1; ret=(c=='-')?0:(c-'0'); while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0'); if(c==' '||c=='\n'){ ret*=sgn; return 1; } while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10; ret*=sgn; return 1; } #define inf 1073741823 #define llinf 4611686018427387903LL #define PI acos(-1.0) #define lth (th<<1) #define rth (th<<1|1) #define rep(i,a,b) for(int i=int(a);i<=int(b);i++) #define drep(i,a,b) for(int i=int(a);i>=int(b);i--) #define gson(i,root) for(int i=ptx[root];~i;i=ed[i].next) #define tdata int testnum;scanff(testnum);for(int cas=1;cas<=testnum;cas++) #define mem(x,val) memset(x,val,sizeof(x)) #define mkp(a,b) make_pair(a,b) #define findx(x) lower_bound(b+1,b+1+bn,x)-b #define pb(x) push_back(x) using namespace std; typedef long long ll; typedef pair<int,int> pii; int n,m,k; char s[111][111]; int dis[111][111][16]; bool vis[111][111][16]; int dx[4]={1,0,0,-1}; int dy[4]={0,1,-1,0}; struct node{ int x,y,st; node(){} node(int xx,int yy,int ss){ x=xx; y=yy; st=ss; } }q[4001000]; int bfs(int sx,int sy){ int sst=0; if(s[sx][sy]!='.')sst|=1<<(s[sx][sy]); vis[sx][sy][sst]=1; dis[sx][sy][sst]=0; int head=0,tail=0; q[tail++]=node(sx,sy,sst); while(head<tail){ int x=q[head].x; int y=q[head].y; int st=q[head++].st; vis[x][y][st]=1; rep(i,0,3){ int nx=x+dx[i]; int ny=y+dy[i]; if(nx>=1&&nx<=n&&ny>=1&&ny<=m){ if(s[nx][ny]=='#')continue; int nst=st; if(s[nx][ny]!='.'){ nst|=1<<(s[nx][ny]-'1'); } if(!vis[nx][ny][nst]){ dis[nx][ny][nst]=min(dis[nx][ny][nst],dis[x][y][st]+1); vis[nx][ny][nst]=1; q[tail++]=node(nx,ny,nst); } } } } int tot=(1<<k)-1; int ans=inf; rep(i,1,n) rep(j,1,m){ ans=min(ans,dis[i][j][tot]); } if(ans==inf)return -1; else return ans; } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ if(n==0||m==0)break; rep(i,1,n)scanf("%s",s[i]+1); int sx,sy; rep(i,1,n) rep(j,1,m){ if(s[i][j]=='@'){ sx=i; sy=j; s[i][j]='.'; } rep(k,0,15)dis[i][j][k]=inf; } scanff(k); mem(vis,0); rep(i,1,k){ int x,y; scanff(x); scanff(y); s[x][y]=i+'0'; } int ans=bfs(sx,sy); printf("%d\n",ans); } return 0; }
相关文章推荐
- (纪录片)统计的乐趣 The Joy of Stats (2010)
- nyoj914Yougth的最大化【二分+贪心】
- uva 10167
- 凸优化中的数学基础知识(范数篇一)内积,欧式范数
- poj 2406 Power Strings
- Golang学习笔记 (一)
- 阿里无线前端性能优化指南 (Pt.1 加载期优化)
- Ubuntu下安装libsvm
- hdu2084 数塔 (动态规划)
- IOS毛玻璃效果
- 汇编语言-[BX]和loop指令
- HDU 4515 模拟
- SQL基础学习6
- 汇编语言-[BX]和loop指令
- Activity的"singleTask"之谜
- Unix c 网络编程 UDP
- 知道的越多,思考得越深,下的决策越正确
- iOS开发计算文本尺寸
- Java基础3笔记
- Unix c 网络编程 TCP