Oil Deposits
http://acm.hdu.edu.cn/showproblem.php?pid=1241
寻找石油,找有几片的油田。 经典的广度搜索。
亮点
{
1.map的使用,空间 + 时间双丰收。
2.使用了转化,把字符 变成 数字。当然对这一题来说是没有什么必要~
3.在使用栈的时候,进入的顺序是 x y 出的时候是 y x,这个考虑到了。
}
Ok~
#include<stdio.h> #include<string.h> char c[102][102]; int a[102][102],f[102][102],zhan[402],f1; int map[8][2]={{1,0},{1,1},{1,-1},{-1,1},{-1,-1},{-1,0},{0,1},{0,-1}}; void bfs(int x,int y,int n,int m) { int i,x1,y1; zhan[++f1]=x; zhan[++f1]=y; while(f1>0) { y=zhan[f1--]; x=zhan[f1--]; for(i=0;i<8;i++) { x1=x+map[i][0]; y1=y+map[i][1]; if(x1>=1&&x1<=n&&y1>=1&&y1<=m) if(a[x1][y1]==1&&f[x1][y1]==0) { f[x1][y1]=1; zhan[++f1]=x1; zhan[++f1]=y1; } } } } int main() { int i,j,n,m,num; while(scanf("%d",&m)>0&&m) { scanf("%d",&n); for(i=1;i<=m;i++) scanf("%s",c[i]+1); for(i=1;i<=100;i++) zhan[i]=0;f1=0;num=0; for(i=1;i<=m;i++) for(j=1;j<=n;j++) { if(c[i][j]=='*') a[i][j]=0; else if(c[i][j]=='@') a[i][j]=1; f[i][j]=0; } for(i=1;i<=m;i++) for(j=1;j<=n;j++) { if(a[i][j]==1&&f[i][j]==0) { num++; bfs(i,j,m,n); } } printf("%d\n",num); } return 0; }