您的位置:首页 > 其它

hdu1241 Oil Deposits(dfs&&bfs)

2016-09-23 10:12 351 查看
这又是一个练习bfs和dfs的非常好的题目,找油井的个数,8个方向只要有,就算同一个,问有多少个

下面是dfs的,没什么可说的

#include <iostream>
#include <string.h>
using namespace std;
char s[105][105];
int n,m;
int xx[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,-1},{1,1},{-1,-1},{-1,1}};
void dfs(int x,int y)
{
// cout<<s[x][y]<<endl;
s[x][y]='*';
for(int i=0;i<8;i++)
{
int nx=x+xx[i][0];
int ny=y+xx[i][1];
if(nx>=0&&nx<m&&ny>=0&&ny<n&&s[nx][ny]=='@')
dfs(nx,ny);
}
}
int main()
{
while(cin>>m>>n)
{
if(m==0&&n==0)
break;
int sum=0;
memset(s,0,sizeof(s));
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>s[i][j];
// cout<<s[i][j]<<endl;
}
}
//  cout<<100<<endl;
//int k=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(s[i][j]=='@')
{
//cout<<s[i][j]<<endl;
//cout<<k++<<endl;
dfs(i,j);
sum++;
}
}
}
cout<<sum<<endl;
}
return 0;
}


这个是bfs的,我写这个的时候MLE了好几次,按理来说是不应该的,只有100个点啊,后来发现我当时是先把点加到栈里,等它弹出了,再变成,但要是那样的话可能会导致点重复加进队列吧,所以要在没进队列之前就变成;

#include <iostream>
#include <queue>
#include <string.h>
#pragma comment(linker, £¢/STACK:102400000,102400000£¢)
using namespace std;
int xx[8][2]= {{0,1},{0,-1},{1,0},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
struct sa
{
int x,y;
} t,a,p;
queue<sa>q;
int n,m;
char s[105][105];
void bfs(int x,int y)
{
t.x=x;
t.y=y;
q.push(t);
while(!q.empty())
{
sa a=q.front();
q.pop();
//s[a.x][a.y]='*';
for(int i=0; i<8; i++)
{
int nx=a.x+xx[i][0];
int ny=a.y+xx[i][1];
if(nx>=0&&nx<m&&ny>=0&&ny<n&&s[nx][ny]=='@')
{
p.x=nx;
p.y=ny;
s[p.x][p.y]='*';
q.push(p);
// cout<<p.x<<" "<<p.y<<endl;
}
}
}
}
int main()
{
while(cin>>m>>n)
{
if(m==0&&n==0)
break;
int sum=0;
memset(s,0,sizeof(s));
while(!q.empty())
q.pop();
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
cin>>s[i][j];
}
}
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
if(s[i][j]=='@')
{
s[i][j]='*';
bfs(i,j);
sum++;
}
}
}
cout<<sum<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dfs bfs 图论