您的位置:首页 > 其它

hdu 1241 Oil Deposits 解题报告

2011-08-24 09:28 323 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241

第一次写搜索代码 花了好大的功夫检查 看了别人的结题报告 还是错误一大堆 哎

题目是这样的 @表示油田 *表示非油田 @与其八个方向@组成一片连续油田 一个@*组成的图 文有几片油田

思路:没被标记找大一个@ 在使用dfs 把所有的相连的油田都标记为已查找

然后油田片数+1;

知道找完所有的点;

用递归的方式实现深搜

#include<iostream>
#include<string>
#include<queue>
usingnamespace std;
int ans=0;
bool visit[100][100]={0};//用一个 bool数组表示是否被找过
char map[100][100];//存储图形
int n,m;
int f[8][2]={1,0,-1,0,0,1,0,-1,1,1,1,-1,-1,-1,-1,1};//没两位表示一个方向 8个方向
void dfs(int x,int y)
{    int i,j,k,dx,dy;
visit[x][y]=1;
for(i=0;i<8;i++)
{

dx=x+f[i][0];
dy=y+f[i][1];
if(dx<0|| dy<0|| dx>=m || dy>=n || map[dx][dy]=='*'|| visit[dx][dy]==1)//改了很多次才改对 这就是菜鸟

                                                                                                          //打得时候忘了visit[dx][dy]==1
continue;
if(map[dx][dy]=='@'&& visit[dx][dy]==0)
{visit[dx][dy]=1;
dfs(dx,dy);//使用了递归的方式 容易理解
}
}
return ;
}
int main()
{
int i,j;
while(scanf("%d %d",&m,&n)!=EOF)
{
getchar();//下面要输入字符 所以要用getchar 接受回车
ans=0;
memset(map,0,sizeof(map));
memset(visit,0,sizeof(visit));
if(n==0&& m==0)
{
break;
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf( "%c",&map[i][j] );
}
getchar();
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(visit[i][j]==0&& map[i][j]=='@')

{
dfs(i,j);
ans++;
}
}
}
printf("%d\n",ans);
}
//system("pause");
return0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: