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;
}

 

思维量不是很大的题目

posted @ 2013-05-26 22:29  paradise in hell  Views(157)  Comments(0Edit  收藏  举报