小试牛刀-搜索基础入门(杭电五题)
来源:互联网 发布:做单页用什么软件 编辑:程序博客网 时间:2024/04/29 16:27
hdu 1241 Oil Deposits
水题,BFS,判断区域的块数。
代码清单:
#include<queue>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;typedef pair<int,int>P;int m,n;char s[105][105];int xy[8][2]={{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1}};void bfs(int x,int y){ queue<P>q; s[x][y]='*'; q.push(P(x,y)); while(q.size()){ P p=q.front(); q.pop(); for(int i=0;i<8;i++){ int xx=p.first+xy[i][0]; int yy=p.second+xy[i][1]; if(xx>=0&&xx<m&&yy>=0&&yy<n&&s[xx][yy]!='*'){ s[xx][yy]='*'; q.push(P(xx,yy)); } } }}int main(){ while(scanf("%d%d",&m,&n)!=EOF){ if(m==0&&n==0) break; //memset(s,'\0',sizeof(s)); for(int i=0;i<m;i++) scanf("%s",s[i]); int ans=0; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(s[i][j]=='@'){ ans++; bfs(i,j); } } } printf("%d\n",ans); }return 0;}
hdu1312 Red and Black
水题,BFS(DFS),求可走点的总和。#include<queue>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;typedef pair<int,int>P;int m,n;int sx,sy;int vis[25][25];char s[25][25];int xy[4][2]={{0,-1},{-1,0},{0,1},{1,0}};int bfs(){ int sum=0; queue<P>q; while(q.size()) q.pop(); q.push(P(sx,sy)); vis[sx][sy]=1; while(q.size()){ P p=q.front(); q.pop(); sum++; for(int i=0;i<4;i++){ int xx=p.first+xy[i][0]; int yy=p.second+xy[i][1]; if(xx>=0&&xx<n&&yy>=0&&yy<m&&s[xx][yy]!='#'&&!vis[xx][yy]){ vis[xx][yy]=1; //cout<<xx<<" "<<yy<<endl; q.push(P(xx,yy)); } } }return sum;}int main(){ while(scanf("%d%d",&m,&n)!=EOF){ if(m==0&&n==0) break; for(int i=0;i<n;i++){ scanf("%s",s[i]); for(int j=0;j<m;j++){ if(s[i][j]=='@'){ sx=i; sy=j; } } } memset(vis,0,sizeof(vis)); printf("%d\n",bfs()); }return 0;}
hdu 1010 Tempter of the Bone
DFS,从中学到了奇偶性剪枝。题意:迷宫中只有一扇门,且只在第K秒时开门,问能否走出迷宫。
#include<queue>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;int first;int N,M,T;int sx,sy;int ex,ey;char s[8][8];int x[4]={1,-1,0,0};int y[4]={0,0,-1,1};void dfs(int X,int Y,int t){ if(t==T){ if(X==ex&&Y==ey) first=1; return ; } if(first) return ; int judge=abs(X-ex)+abs(Y-ey)-abs(t-T); //奇偶性剪枝:judge<=0且为偶数才可以继续 if(judge>0 || judge%2) return ; for(int i=0;i<4;i++){ int xx=X+x[i]; int yy=Y+y[i]; if(xx>=0&&xx<N&&yy>=0&&yy<M&&s[xx][yy]!='X'){ s[xx][yy]='X'; dfs(xx,yy,t+1); s[xx][yy]='.'; } }}int main(){ while(scanf("%d%d%d",&N,&M,&T)!=EOF){ if(N==0&&M==0&&T==0) break; int pos=0; for(int i=0;i<N;i++){ scanf("%s",s[i]); for(int j=0;j<M;j++){ if(s[i][j]=='S'){ sx=i; sy=j; } else if(s[i][j]=='D'){ ex=i; ey=j; } else if(s[i][j]=='X'){ pos++; } } } if(N*M-pos<=T) printf("NO\n"); //可走的点数必须大于T else{ first=0; s[sx][sy]='X'; dfs(sx,sy,0); if(first) printf("YES\n"); else printf("NO\n"); } }return 0;}
hdu 1242 Rescue
优先队列+BFS。注意救援有多个,所以以终点为起始点,只要走到一个最近的救援点即可。#include<queue>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;struct edge{ int x,y; int t; friend bool operator<(edge a,edge b){ return a.t>b.t; }};int N,M;int ex,ey,ok;int vis[205][205];char s[205][205];int xy[4][2]={{0,-1},{-1,0},{0,1},{1,0}};int bfs(){ priority_queue<edge>q; while(q.size()) q.pop(); edge p; p.x=ex; p.y=ey; p.t=0; vis[ex][ey]=1; q.push(p); while(q.size()){ p=q.top(); q.pop(); if(s[p.x][p.y]=='r'){ return p.t; } for(int i=0;i<4;i++){ edge w; w.x=p.x+xy[i][0]; w.y=p.y+xy[i][1]; if(w.x>=0&&w.x<N&&w.y>=0&&w.y<M&&s[w.x][w.y]!='#'&&!vis[w.x][w.y]){ w.t=p.t+1; if(s[w.x][w.y]=='x') w.t++; vis[w.x][w.y]=1; q.push(w); } } } return -1;}int main(){ while(scanf("%d%d",&N,&M)!=EOF){ for(int i=0;i<N;i++){ scanf("%s",s[i]); for(int j=0;j<M;j++){ if(s[i][j]=='a'){ ex=i; ey=j; } } } memset(vis,0,sizeof(vis)); int ans=bfs(); if(ans!=-1) printf("%d\n",ans); else printf("Poor ANGEL has to stay in the prison all his life.\n"); }return 0;}
hdu 1026 Ignatius and the Princess I
优先队列+BFS+路径还原。
#include<queue>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;struct edge{ int x,y; int t,r; friend bool operator<(edge c,edge d){ return c.t>d.t; }}a[10000],b[105][105]; //b数组记录路径int N,M;int vis[105][105];char s[105][105];int xy[4][2]={{0,-1},{-1,0},{0,1},{1,0}};void bfs(){ priority_queue<edge>q; while(q.size()) q.pop(); edge p,w; p.x=0; p.y=0; p.t=0,p.r=0; vis[0][0]=1; q.push(p); int first=0; while(q.size()) { p=q.top(); q.pop(); if(p.x==N-1&&p.y==M-1){ first=1; break; } for(int i=0;i<4;i++){ w.x=p.x+xy[i][0]; w.y=p.y+xy[i][1]; if(w.x>=0&&w.x<N&&w.y>=0&&w.y<M&&s[w.x][w.y]!='X'&&!vis[w.x][w.y]){ b[w.x][w.y].x=p.x; b[w.x][w.y].y=p.y; w.t=p.t+1; w.r=p.r+1; vis[w.x][w.y]=1; if(s[w.x][w.y]!='.') w.t=w.t+s[w.x][w.y]-'0'; q.push(w); } } } if(first) { int k=1; int i=p.r-1,xx=p.x,yy=p.y; a[p.r].x=p.x; a[p.r].y=p.y; for(i=p.r-1;i>=0;i--){ a[i].x=b[xx][yy].x; a[i].y=b[xx][yy].y; xx=a[i].x; yy=a[i].y; } printf("It takes %d seconds to reach the target position, let me show you the way.\n",p.t); for(int i=0;i<p.r;i++){ printf("%ds:(%d,%d)->(%d,%d)\n",k++,a[i].x,a[i].y,a[i+1].x,a[i+1].y); if(s[a[i+1].x][a[i+1].y]!='.'&&s[a[i+1].x][a[i+1].y]!='X'){ int tt=s[a[i+1].x][a[i+1].y]-'0'; while(tt--) printf("%ds:FIGHT AT (%d,%d)\n",k++,a[i+1].x,a[i+1].y); } } } else printf("God please help our poor hero.\n"); printf("FINISH\n");}int main(){ while(scanf("%d%d",&N,&M)!=EOF){ for(int i=0;i<N;i++) scanf("%s",s[i]); memset(vis,0,sizeof(vis)); bfs(); }return 0;}
0 0
- 小试牛刀-搜索基础入门(杭电五题)
- 基础搜索入门(二)
- 【计蒜客】基础算法入门之深度搜索
- 简单搜索(基础)
- HDU 1010 (入门搜索)
- 广度优先搜索(入门)
- EasyUI基础入门之searchbox&progressbar(搜索框和进度条)
- 搜索+分页(工作基础)
- 基础搜索01(poj2386)
- 搜索入门
- 搜索入门
- 搜索入门
- 搜索入门
- 搜索入门
- 【搜索入门】搜索字符串
- 基础搜索
- 基础入门(1)
- (一)基础入门
- 数字电路设计之格雷码与二进制之间的转换
- POST提交JSON数据
- 第一次在CSDN上发表文章
- 面试题积累(三)
- 排序算法
- 小试牛刀-搜索基础入门(杭电五题)
- 自制进度圈
- 设计模式:21 单例模式
- java 数组中求最值
- 安卓面试题 整废你 ,萌死你
- Android SlidingMenu 使用详解
- 在枚举中使用位移
- HitS内部的缓存实现源代码
- unity的Mecanim动画系统基础教程