poj 3259

来源:互联网 发布:修改linux文件名夹 编辑:程序博客网 时间:2024/05/18 02:14

写之前先让我吐槽一会:这个程序我从7:00改到现在,6个小时,重新写了好几遍,后来无意间尝试了一下——局部变量重新严格赋值,居然ac了,我***心中。。。。。。


题目大意:
       农场里有数个通道,也有虫洞,他们俩的功能是一样的就是进行位置转移,但通道是双向(!!!双向),虫洞单向的。虫洞可以使时间倒转。

      现在给出山洞的个数,通道和虫洞的个数以及所需(穿越)的时间,问是否能够进行时间旅行。

 

       思路就是找负环,没什么好说的。但即使找负环我也是砍了好久(英语太差)看不懂,而且通道双向!!!起初位置任意!!!

       我的是略次的500Ms的dfs算法

    <span style="font-size:12px;">    #include <iostream>    using namespace std;    char table[80][80];    short vis[80][80];    int main()    {    int loops=-1;    bool flag=1;    int n=0,m,s;    int ans=0;    while(1)    {    loops=-1;    ans=0;    flag=1;    cin>>n>>m>>s;    if(n==0)break;    for (int i=1;i<=n;++i)      for (int j=1;j<=m;++j)      {        cin>>table[i][j];        vis[i][j]=0;      }        int i1=1,j1=s;        vis[i1][j1]=1;        for(int cnt=2;;cnt++)        {        int ni=i1,nj=j1;        switch(table[i1][j1])            {            case 'N':ni--;break;            case 'S':ni++;break;            case 'W':nj--;break;            case 'E':nj++;break;    }    if(ni<1||nj<1||ni>n||nj>m)    {    ans=cnt-1;    flag=1;    break;    };;    if(vis[ni][nj]!=0)    {    ans=vis[ni][nj]-1;    flag=0;    loops=cnt-vis[ni][nj];    break;    }    else vis[ni][nj]=cnt;    i1=ni;    j1=nj;    }    if(flag)       printf("%d step(s) to exit\n",ans);    else printf("%d step(s) before a loop of %d step(s)\n",ans,loops);    }    return 0;    }</span>
   其实有更好的bellmanford算法(或者用bfs)

   bfs并不打算写,准备明天尝试下bellmanford,今天先睡了。

1 0
原创粉丝点击