ACM题解报告——HD1241
今天解了杭电OJ1241题,题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241
题目的大体意思就是找出不同的油田数量并输出,注意相邻的油井都属于同一块油田(ps:它的相邻也包括左上,左下,右上,右下,开始读题目半天都没搞懂这个,囧死了)。
这题可以用搜索来解决,这里我分别用了深搜和广搜AC了一遍:
深搜代码:
#include<iostream>
using namespace std;
int map[105][105],m,n;
int fx[8]={-1,-1,-1,0,0,1,1,1},fy[8]={-1,1,0,1,-1,1,-1,0};
int check(int a,int b,int k)
{
int flag=1;
a+=fx[k];
b+=fy[k];
if(a<1||a>m||b<1||b>n)
flag=0;
if(map[a][b]==0)
flag=0;
return flag;
}
void dfs(int a,int b)
{
int i;
int newx,newy;
for(i=0;i<8;i++)
{
if(check(a,b,i)==1)
{
newx=a+fx[i];
newy=b+fy[i];
map[newx][newy]=0;
dfs(newx,newy);
}
}
}
int main( )
{
int i,j;
char ch;
while(cin>>m>>n&&(m||n))
{
int count=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
cin>>ch;
if(ch=='@') map[i][j]=1;
if(ch=='*') map[i][j]=0;
}
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
if(map[i][j])
{
count++;
dfs(i,j);
}
}
cout<<count<<endl;
}
return 0;
}
广搜代码:
#include<iostream>
using namespace std;
int map[105][105],m,n;
int fx[8]={-1,-1,-1,0,0,1,1,1},fy[8]={-1,1,0,1,-1,1,-1,0};
typedef struct
{
int x;
int y;
}Node;
Node node[10005];
int check(int a,int b,int k)
{
int flag=1;
a+=fx[k];
b+=fy[k];
if(a<1||a>m||b<1||b>n)
flag=0;
if(map[a][b]==0)
flag=0;
return flag;
}
void bfs(int a,int b)
{
int i,head,tail;
head=0;
tail=1;
node[1].x=a;
node[1].y=b;
while( head!=tail)
{
head++;
for(i=0;i<8;i++)
{
if(check(node[head].x,node[head].y,i)==1)
{
tail++;
node[tail].x=node[head].x+fx[i];
node[tail].y=node[head].y+fy[i];
map[node[tail].x][node[tail].y]=0;
}
}
}
}
int main( )
{
int i,j;
char ch;
while(cin>>m>>n&&(m||n))
{
int count=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
cin>>ch;
if(ch=='@') map[i][j]=1;
if(ch=='*') map[i][j]=0;
}
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
if(map[i][j])
{
count++;
bfs(i,j);
}
}
cout<<count<<endl;
}
return 0;
}
思维量不是很大的题目