ArcTan

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

poj3414(bfs)

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

bfs:都是些基本的算法了,各种bfs写了不少啦。
这个题目也挺简单的,主要是那几个转移方向还是要优化下好写,觉得自己写得还可以哈:
嘿嘿:
bfs:0ms
#include<stdio.h>
#include
<string.h>
#include
<math.h>
int a[2],c,head,tail;
int que[10005][2],pre[10005],p[10005],vis[105][105],ans[10005];
int check()
{
    
if (que[tail][0]==c||que[tail][1]==c)
        
return 1;
    
return 0;
}
int Fill(int i)
{
    
int t=tail+1;
    que[t][
0]=que[head][0];
    que[t][
1]=que[head][1];
    que[t][i
-1]=a[i-1];
    
if (!vis[que[t][0]][que[t][1]])
    {
        vis[que[t][
0]][que[t][1]]=1;
        p[t]
=i;
        pre[t]
=head;
        
return 1;
    }
    
return 0;
}
int Drop(int i)
{
    
int t=tail+1;
    que[t][
0]=que[head][0];
    que[t][
1]=que[head][1];
    que[t][i
-1]=0;
    
if (!vis[que[t][0]][que[t][1]])
    {
        vis[que[t][
0]][que[t][1]]=1;
        p[t]
=2+i;
        pre[t]
=head;
        
return 1;
    }
    
return 0;
}
int Four(int i,int j)
{
    
int min,t=tail+1;
    min
=(que[head][i-1])<(a[j-1]-que[head][j-1])?(que[head][i-1]):(a[j-1]-que[head][j-1]);
    que[t][j
-1]=que[head][j-1]+min;
    que[t][i
-1]=que[head][i-1]-min;
    
if (!vis[que[t][0]][que[t][1]])
    {
        vis[que[t][
0]][que[t][1]]=1;
        p[t]
=4+i;
        pre[t]
=head;
        
return 1;
    }
    
return 0;
}
int bfs()
{
    
int i,tmp;
    memset(vis,
0,sizeof(vis));
    head
=0;
    tail
=1;
    que[
1][0]=0;
    que[
1][1]=0;
    vis[
0][0]=1;
    pre[
1]=0;
    p[
1]=0;
    
while (head<tail)
    {
        head
++;
        tmp
=1;
        
for (i=1; i<=2 ; i++ )
        {
            
if (Fill(i))
                tail
++;
            
if (check())
                
return tail;
            
if (Drop(i))
                tail
++;
            
if (check())
                
return tail;
            
if (Four(i,i+tmp))
                tail
++;
            
if (check())
                
return tail;
            tmp
=-1;
        }
    }
    
return 0;
}
int print(int k)
{
    
int i;
    
if (!k)
    {
        printf(
"impossible\n");
        
return 0;
    }
    i
=0;
    
while (k)
    {
        ans[
++i]=p[k];
        k
=pre[k];
    }
    printf(
"%d\n",i-1);
    
for (k=i-1; k>=1 ; k-- )
    {
        
if (ans[k]<=2)
        {
            printf(
"FILL(%d)\n",ans[k]);
            
continue;
        }
        
if (ans[k]<=4)
        {
            printf(
"DROP(%d)\n",ans[k]-2);
            
continue;
        }
        
if (ans[k]==5)
            printf(
"POUR(1,2)\n");
        
else
            printf(
"POUR(2,1)\n");
    }
    
return 0;
}

int main()
{
    
int k;
    scanf(
"%d%d%d",&a[0],&a[1],&c);
    
if (c>a[0]&&c>a[1])
        k
=0;
    
else
        k
=bfs();
    print(k);
    
return 0;
}

这几天的bfs,dfs,都是第一次就AV,挺爽的,嘿嘿。
多写写恶心的代码,以后就不恶心了,哈哈。

很纳闷,那些用很少内存的是怎么做到的呢?看来自己还是很弱啊~~~

posted on 2012-04-02 17:47 wangs 阅读(769) 评论(0)  编辑 收藏 引用 所属分类: ACM-模拟


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