ArcTan

dfs
随笔 - 16, 文章 - 117, 评论 - 6, 引用 - 0
数据加载中……

poj3083(bfs+dfs)

http://poj.org/problem?id=3083

题意就是在图里遍历遍历:bfs+dfs.
哈哈,dfs,顺时针和逆时针,学会这个好方法真好。
刚刚开始好恶心恶心的说,没有找到好办法,经验太少了。嘿嘿,慢慢积累经验哈。

代码好丑,需要改改了:
#include<stdio.h>
#include<string.h>
#include<math.h>
int t,n,m,xs,ys,xx,yy,least,right,left,step;
int a[45][45],vis[45][45],que[20005][2];
int go[4][2]= {{-1,0},{0,1},{1,0},{0,-1}};
int bfs(int x,int y)
{
    int head,tail,x1,y1,x2,y2,i;
    head=0;
    tail=1;
    que[1][0]=x;
    que[1][1]=y;
    vis[x][y]=1;
    while (head<tail)
    {
        head++;
        x1=que[head][0];
        y1=que[head][1];
        for (i=0; i<4 ; i++ )
        {
            x2=x1+go[i][0];
            y2=y1+go[i][1];
            if (a[x2][y2]&&!vis[x2][y2])
            {
                tail++;
                if (x2==xx&&y2==yy)
                    return vis[x1][y1]+1;
                que[tail][0]=x2;
                que[tail][1]=y2;
                vis[x2][y2]=vis[x1][y1]+1;
            }
        }
    }
}
int dfs(int g,int x,int y,int k)    //这里确定下一步该走哪个方向。需要找到第一个可以走的方向。
{
    int i,x1,y1,gg;
    step=1;
    while (x!=xx||y!=yy)
    {
        for (i=1; i<=4 ; i++ )
        {
            gg=(g+k*i+4)%4;
            x1=x+go[gg][0];
            y1=y+go[gg][1];
            if (a[x1][y1])    //如果当前可走就break;
                break;
        }
        step++;
        g=(gg+2)%4;  //由x,y向gg方向走去x1,y1,则是通过(gg+2)%4这个方向到达x1,y1的。然后循环迭代。
        x=x1;
        y=y1;
    }
}
int init()
{
    int i,j;
    char st[50];
    scanf("%d%d",&m,&n);
    memset(a,0,sizeof(a));
    for (i=1; i<=n ; i++ )
    {
        getchar();
        scanf("%s",&st);
        for (j=0; j<m ; j++ )
        {
            if (st[j]!='#')
                a[i][j+1]=1;
            if (st[j]=='S')
                xs=i,ys=j+1;
            if (st[j]=='E')
                xx=i,yy=j+1;
        }
    }
}
int work()
{
    int g;
    memset(vis,0,sizeof(vis));
    least=bfs(xs,ys);
    if (xs==1)
        g=0;
    else if (ys==m)
        g=1;
    else if (xs==n)
        g=2;
    else
        g=3;
    dfs(g,xs,ys,1);
    left=step;
    dfs(g,xs,ys,-1);
    right=step;
}
int main()
{
    scanf("%d",&t);
    while (t--)
    {
        init();
        work();
        printf("%d %d %d\n",left,right,least);
    }
    return 0;
}

额,bfs和dfs写了好几个咯,该学学剪枝啦。好多东西呢,

posted on 2012-03-31 20:43 wangs 阅读(501) 评论(0)  编辑 收藏 引用 所属分类: ACM-201203


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