标签:++ i++ queue div nbsp 掌握 you front nod
题意:找出地图上的油层数,每个油层由多个油藏组成,这些油藏相邻,常规的搜索问题,每次向八个方向搜寻油藏。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241
友情链接:点这里。
此处为DFS代码:
#include<stdio.h> #include<queue> #include<iostream> #include<string.h> using namespace std; int m,n; char mp[105][105]; void dfs(int a,int b) { mp[a][b]=‘*‘;//找到了油田就把它改成*避免重复查找 for(int dx=-1;dx<=1;dx++) { for(int dy=-1;dy<=1;dy++) { int nx=a+dx; int ny=b+dy; if(nx>=1&&nx<=m&&ny>=1&&ny<=n&&mp[nx][ny]==‘@‘) dfs(nx,ny);//最关键的地方,递归找到的新油田。 } } } int main(void) { while(cin>>m>>n&&m&&n)//这里当m和m为0的时候就退出循环 { int sum=0;//每次初始化sum为0。 for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { cin>>mp[i][j]; } } for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { if(mp[i][j]==‘@‘) { dfs(i,j); sum++;//每找到一个油藏sum就++。 } } } printf("%d\n",sum); } return 0; }
当然这种题用bfs也可以,只是觉得DFS写着简便易懂一点,bfs就不详细论述了,毕竟我这题用bfs做ML了好几次,,,,
#include<iostream> #include<queue> #include<stdio.h> #include<string.h> #define N 100 using namespace std; int r,c,ans; char mp[N][N]; bool vis[N][N]; int fx[8]={1,0,-1,0,-1,1,-1,1}; int fy[8]={0,1,0,-1,-1,-1,1,1}; struct node { int x,y; }; bool check(int x,int y) { if(!vis[x][y] && mp[x][y]==‘@‘ && x>=0 && x<r && y>=0 && y<c ) return 1; return 0; } void bfs(int x,int y) { queue<node> q; q.push({x,y}); while(q.size()) { node now=q.front(); q.pop(); for(int i=0;i<8;i++) { int nextx=now.x + fx[i]; int nexty=now.y + fy[i]; if(check(nextx,nexty)) { vis[nextx][nexty]=1; q.push({nextx,nexty}); } } } return ; } int main() { ios_base::sync_with_stdio; while(cin>>r>>c && r) { ans=0; memset(vis,0,sizeof vis); memset(mp,0,sizeof mp); for(int i=0;i<r;i++) { for(int j=0;j<c;j++) { cin>>mp[i][j]; } } for(int i=0;i<r;i++) { for(int j=0;j<c;j++) { if(mp[i][j]==‘@‘ && !vis[i][j]) { bfs(i,j); ans++; } } } cout<<ans<<endl; } return 0; }
小结一下:此题推荐使用深搜,每次搜索都能将一片油藏搜索出来,不过这两种算法最好都要掌握。
标签:++ i++ queue div nbsp 掌握 you front nod
原文地址:https://www.cnblogs.com/YHH520/p/12229546.html