Onway

我是一只菜菜菜菜鸟...
posts - 61, comments - 56, trackbacks - 0, articles - 34

pku 3620简单搜索

Posted on 2010-08-10 16:49 Onway 阅读(338) 评论(0)  编辑 收藏 引用 所属分类: 伤不起的ACM
 

pku 3620简单搜索

 

题意:在一块地里面,干燥的点标记为0,潮湿的点标记为1;求相连的1的最大个数。

 

由于自己对搜索不太熟悉,当时以为是记忆化搜索,后来用dfs和bfs各写了一次后,感觉就是一纯粹的搜索而已。

我到目前也还觉得,记忆化搜索是DP的一类,搜索过的地方,记录下来,是要多次用到的。而这个题的搜索,只需简单的标记一下搜索过的地方,以便不会再搜,而对已搜索的地方进行标记是搜索题的一个共性吧?

 

当时写dfs多开了一个数组进行标记,后来看了一下别人的代码,看到标记数组都不用开,直接在原数组进行标记就得。这样我才开始思考,记忆化搜索与简单搜索的不同,记忆化搜索由于要用到搜索过的地方,直接用原数组进行了标记,就无法记录(也不能太绝对,可能有些情况用记录值也可以达到标记的效果,这个题貌似也可以,但可能就比较麻烦)。

这个题目用原数组进行标记的话,就要开一个变量统计每一轮搜索的最大值。但这种方法确实是好。

 

然后用bfs来写的话,就要用到一个队列。当时自己写一个队列类,调了N久才发现自己错在一个很低级的理解错误上。我定义一个类,类里面有静态成员,我的目的就是想让静态数据成员进行记录队列长度。然后又将类像链表结构体一样进行动态分配进行链接,还以为那个静态成员依然是原来那个。

 

写出来后发现有很大浪费,主要是由于指针指向没有认真分析,然后稳健性也非常不好。

干脆用STL的queue算了。

然后又没有注意同一个点进行了多次进队,WA一次。

 

//    dfs
/*
     
#include <iostream>
using namespace std;
int data[101][101],n,m;
bool sgn[101][101];
int main()
{
    int dfs(int,int);
    int k,i,j,r,c,ans=0;
    memset(data,0,sizeof(data));
    memset(sgn,0,sizeof(sgn));
    scanf("%d%d%d",&n,&m,&k);
    for(i=1;i<=k;++i)
    {
        scanf("%d%d",&r,&c);
        data[r][c]=1;
    }
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
        {
                dfs(i,j);
                ans=ans>data[i][j]?ans:data[i][j];
        }
    printf("%d\n",ans);
}
int dfs(int i,int j)
{
    if(sgn[i][j])    return 0;
    if(data[i][j]!=1)    return data[i][j];
    sgn[i][j]=1;
    return data[i][j]+=dfs(i-1,j)+dfs(i,j+1)+dfs(i+1,j)+dfs(i,j-1);
}
*/



//bfs
/*

#include <iostream>
#include <queue>
using namespace std;
int data[101][101],n,m,num;
struct point
{
    int x;int y;
};
queue<point> myq;
point conver(int a,int b)
{
    point f;f.x=a;f.y=b;return f;
}
void bfs()
{
    point s;
    while(!myq.empty())
    {
        s=myq.front();
        myq.pop();
        if(data[s.x+1][s.y]==1)        {myq.push(conver(s.x+1,s.y));data[s.x+1][s.y]=0;}
        if(data[s.x][s.y+1]==1)        {myq.push(conver(s.x,s.y+1));data[s.x][s.y+1]=0;}
        if(data[s.x-1][s.y]==1)        {myq.push(conver(s.x-1,s.y));data[s.x-1][s.y]=0;}
        if(data[s.x][s.y-1]==1)        {myq.push(conver(s.x,s.y-1));data[s.x][s.y-1]=0;}
        ++num;
    }    
}
int main()
{
    int k,i,j,r,c,max=0;
    scanf("%d%d%d",&n,&m,&k);
    memset(data,0,sizeof(data));
    for(i=1;i<=k;++i)
    {
        scanf("%d%d",&r,&c);
        data[r][c]=1;
    }
    for(i=1;i<=n;++i)
        for(j=1;j<=n;++j)
            if(data[i][j]==1)
            {
                data[i][j]=0;
                myq.push(conver(i,j));
                num=0;
                bfs();
                if(num>max)    max=num;
            }
    printf("%d\n",max);
    return 0;
}


*/

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理