Oil Deposits(hdu1241简单的bfs)

来源:互联网 发布:spring源码tx 编辑:程序博客网 时间:2024/04/27 18:56

题意:寻找有多少块独立的油田

思路:bfs搜索,遇到@就搜索所有与之相连的@然后将其置成*,遍历整个图看看搜索了多少次,就是答案,八方向的广搜

总结:在读图的时候使用%s一行一行的读,如果用%c还要用getchar()吃掉每一行的回车,有点麻烦并且这道题目数据有多余的空格,只能用%s

广搜代码:

#include<iostream>#include<cstdio>#include<queue>#include<cstring>using namespace std;int n,m;char map[105][105];int dect[8][2] = {0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};void bfs(int x,int y){queue<int> q;q.push(x);q.push(y);while(!q.empty()){int xx = q.front();q.pop();int yy = q.front();q.pop();int i;for(i = 0; i < 8; i++){int xg = xx + dect[i][0];int yg = yy + dect[i][1];if(xg>= 0 && xg < n && yg >= 0 && yg < m && map[xg][yg] != '*'){if(map[xg][yg] == '@'){map[xg][yg] = '*';q.push(xg);q.push(yg);}}}}}int main(){while(scanf("%d %d",&n,&m) != EOF){int i,j;memset(map,'\0',sizeof(map));if(n == 0 && m == 0)break;getchar();for(i = 0; i < n; i++){scanf("%s",map[i]);}int sum = 0;for(i = 0; i < n; i++){for(j = 0; j < m; j++){if(map[i][j] == '@'){bfs(i,j);sum++;}}}printf("%d\n",sum);}return 0;}

深搜代码:

#include<iostream>#include<cstdio>#include<queue>#include<cstring>using namespace std;int n,m;char map[105][105];int dect[8][2] = {0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};void dfs(int x,int y){if(x >= 0 && x < n && y >= 0 && y < m){int i;for(i = 0; i < 8; i++){int gx = x+dect[i][0];int gy = y+dect[i][1];if(map[gx][gy] == '@'){map[gx][gy] = '*';dfs(gx,gy);}}}}int main(){while(scanf("%d %d",&n,&m) != EOF){int i,j;memset(map,'\0',sizeof(map));if(n == 0 && m == 0)break;getchar();for(i = 0; i < n; i++){scanf("%s",map[i]);}int sum = 0;for(i = 0; i < n; i++){for(j = 0; j < m; j++){if(map[i][j] == '@'){dfs(i,j);sum++;}}}printf("%d\n",sum);}return 0;}