vijos P1051 送给圣诞夜的极光

vijos P1051 送给圣诞夜的极光

这是一道不能再简单的题目了,我的做法是bfs,其实这题可以bfs可以dfs,随便,看爱好了(floodfill其实和bfs差不多)。

这道题虽然很简单,但很惭愧,我交了很多次……

第一次,低级错误,把一次bfs放在内层循环外面了~

第二次,第十个数据WA

第三次,忘记把用来调试的代码删掉,超囧~

第四次,把第三次的代码上面的部分代码删掉,AC

 

但是我其中还是犯了一个不小的错误,虽然侥幸AC了。我用used[i][j]把每次出队的点标记,但是这样有了重复现象,我开了一个10000的队列结果内存不够用。后来改正了一下,不使用used[i][j]=01,而是把入队的点从“#”改为“-”,这样一来在条件中判断一下就可以避免重复了。

感觉这个错误也挺低级,以前bfs的时候都没有这个错误……唉,搜索还是需要加强啊。

不过这个错误也对我有了一个提醒,在竞赛内存允许的情况下多开内存还是可以避免一些不必要的错误的,比如这题,开60000的队列,我的错误方法完全没有问题。

不多说,现在练习中出的错也是一种积累吧。

给出代码,自然没有dfs简短了。

#include < stdio.h >
#define  size 10000
struct
{
    
long x[size],y[size],front,rear,count;
}
q;
void  clear()
{
    q.count
=0;
    q.front
=0;
    q.rear
=-1;
}

void  put( long  a, long  b)
{
    q.count
++;
    q.rear
++;
    q.x[q.rear]
=a;
    q.y[q.rear]
=b;
}

void   get ( long   * a, long   * b)
{
    q.count
--;
    
*a=q.x[q.front];
    
*b=q.y[q.front];
    q.front
++;
}

int  empty()
{
    
return (q.count==0);
}

int  main()
{
    clear();
    
long n,m,i,j,k,t1,t2,ans,sign;
    
long xd[]={-1,-1,0,1,1,1,0,-1,-2,0,2,0};
    
long yd[]={0,1,1,1,0,-1,-1,-1,0,2,0,-2};
    
char map[101][101]={0};
    scanf(
"%ld%ld",&n,&m);
    
for(i=1;i<=n;i++)
    
{
       scanf(
"\n");
       
for(j=1;j<=m;j++)
         scanf(
"%c",&map[i][j]);
    }

    ans
=0;
    
for(i=1;i<=n;i++)
      
for(j=1;j<=m;j++)
        
if(map[i][j]=='#')
        
{
           put(i,j);
           map[i][j]
='-';
           
while(!empty())
           
{
              
get(&t1,&t2);
              
for(k=0;k<12;k++)
                
if(t1+xd[k]>=1&&t1+xd[k]<=n&&t2+xd[k]>=1&&t2+xd[k]<=m&&map[t1+xd[k]][t2+yd[k]]=='#')
                
{
                   put(t1
+xd[k],t2+yd[k]);
                   map[t1
+xd[k]][t2+yd[k]]='-';
                }

           }

           ans
++;
        }

    printf(
"%ld\n",ans);
    getchar();getchar();
return 0;
}

你可能感兴趣的:(vijos P1051 送给圣诞夜的极光)