您的位置:首页 > 其它

PKU 1562

2014-03-27 14:27 162 查看
#include<iostream>
#include<fstream>
#include<stdio.h>
#include<string.h>
using namespace std;
int map[100][100],vis[100][100],n,m;
char c;
int add[8][2]={{0,-1},{0,1},{-1,0},{1,0},{-1,-1},{1,-1},{-1,1},{1,1}};//用这个数组来一次遍历各个坐标的上,下,左,右,左上,左下,右上,右下的8个点
int ma;
void dfs(int x,int y)
{
int i,j,x_x,y_y;
//vis[x][y]=1;
for(i=0;i<8;i++)
{
x_x=x+add[i][0];
y_y=y+add[i][1];
if(x_x>=0&&x_x<n&&y_y>=0&&y_y<m&&map[x_x][y_y]&&!vis[x_x][y_y])//对只满足条件的点进行相应的操作
{
//ma++;
//vis[x][y]=1;
vis[x_x][y_y]=1; 											//对已经访问过的点进行标记,防止再次访问,即在对一个点的8个方向的点遍历时,减少不必要的操作
dfs(x_x,y_y);												//对i,j坐标上的点的8个方向上的点进行遍历
}

}
return ;
}
int main()
{
//ifstream cin("data.txt");
freopen("data.txt","r",stdin);
int i,j;
//while(cin>>n>>m&&m&&n)
while(scanf("%d%d",&n,&m)&&n)
{
ma=0;
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)												//两个for()循环的作用是,对n行,m列的各个坐标元素依次进行搜索的操作,直道遍历完毕后得出正确的结果
for(j=0;j<m;j++)
{
cin>>c;
if(c=='@') map[i][j]=1;										//对有oil deposits的地方进行标记以此区分其它坐标点,使遍历或者搜索更加简洁,快速
else  map[i][j]=0;
}
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(map[i][j]&&!vis[i][j]) 										//通过对在dfs()中已经做了标记的元素进行相应的操作,在这个循环里只需要找出满足条件的坐标点即可,在这里搜索出所要的答案
{
ma++;
dfs(i,j);
}
}
cout<<ma<<endl;
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: