poj 3083

来源:互联网 发布:仓廪实而知礼节 编辑:程序博客网 时间:2024/06/06 12:26
刚开始提交的时候,超时,以为是stl queue的原因,把queue改成数组,结果还是超时,一直再找原因,后来将普通递归(非尾递归)改成尾递归的形式,就AC 了。

点击(此处)折叠或打开

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include<cstring>
  4. #include<queue>

  5. using namespace std;

  6. struct move{
  7.     int i;
  8.     int j;
  9. }MOVE[4] = {{-1,0} , {0,1},{1,0},{0,-1}};

  10. int n,p,q,step;
  11. int si,sj,ei,ej;
  12. #define MAX_V (40+1)

  13. char T[MAX_V][MAX_V];
  14. char C[MAX_V][MAX_V];

  15. int isValid(int i,int j)
  16. {
  17.     if ( i< 1 || i> q)
  18.         return 0;
  19.     if( j< 1 || j> p)
  20.         return 0;

  21.     return 1;
  22. }

  23. struct qv
  24. {
  25.     int i;
  26.     int j;
  27.     int l;
  28. }PT[500000];



  29. int bfs()
  30. {
  31.     memset(C,0,sizeof(C));
  32.     int h=0;
  33.     int t=1;

  34.     PT[h].i=si;
  35.     PT[h].j=sj;
  36.     PT[h].l=1;

  37.     while(h < t)
  38.     {
  39.         struct qv pt = PT[h];
  40.         h++;

  41.         //cout<<"h:"<<h<<endl;
  42.         for(int m=0;m<4;m++)
  43.         {
  44.                 
  45.             int mi = pt.i + MOVE[m].i;
  46.             int mj = pt.j + MOVE[m].j;
  47.             
  48.             if( !isValid(mi,mj))
  49.                 continue;

  50.             if(C[mi][mj] != 0)
  51.                 continue;
  52.             if(T[mi][mj] == 'E')
  53.                 return pt.l +1;
  54.             
  55.             if(T[mi][mj] == '.')
  56.             {
  57.                 PT[t].i = mi;
  58.                 PT[t].j = mj;
  59.                 PT[t].l = pt.l +1;
  60.                 C[mi][mj]=1;

  61.                 t++;
  62.             }
  63.         }    
  64.     }

  65.     return 0;
  66. }

  67. int dfsVisit(int i,int j,int rfirst,int d) //d代表方向,从哪个方向来的 rfirst代表右优先,还是左优先
  68. {
  69.     int start,mm,mi,mj;

  70.     if(T[i][j] == 'E')
  71.         return 1;

  72.     if(!rfirst)
  73.         start = d-1;
  74.     else
  75.         start = d+1;

  76.     for( int c=0;c< 4;c++)
  77.     {
  78.         if(!rfirst)
  79.             mm = start +c;
  80.         else
  81.             mm=start -c;


  82.         //printf("before mm=%d \n",mm);
  83.         if(mm < 0)
  84.             mm += 4;

  85.         if(mm > 3)
  86.             mm -= 4;
  87.         
  88.         mi = i + MOVE[mm].i;
  89.         mj = j + MOVE[mm].j;

  90.         //printf("after mm=%d (%d,%d)->(%d,%d)\n",mm,i,j,mi,mj);

  91.         //printf("\tm=%d mm=%d,mi=%d,mj=%d\n",m,mm,mi,mj);
  92.         if ( !isValid(mi,mj) )
  93.         {
  94.             //printf("mi=%d mj=%d non valid\n",mi,mj);
  95.             continue;
  96.         }

  97.         if( T[mi][mj] == '#' )
  98.         {
  99.             continue;
  100.         }

  101.         break;
  102.     }

  103.     
  104.     return dfsVisit(mi,mj,rfirst,mm)+1;
  105. }

  106. int main()
  107. {
  108.     cin>>n;

  109.     for(int k=1;k<=n;k++)
  110.     {
  111.         cin>>p>>q;
  112.         for(int i=1;i<=q;i++)
  113.         {
  114.             for(int j=1;j<=p;j++)
  115.             {
  116.                 cin>>T[i][j];
  117.                 if(T[i][j] == 'S')
  118.                 {
  119.                     si=i;
  120.                     sj=j;
  121.                 }
  122.                 else if (T[i][j] == 'E')
  123.                 {
  124.                     ei=i;
  125.                     ej=j;
  126.                 }
  127.             }
  128.         }
  129.         //cout<<"si:"<<si<<"sj:"<<sj<<endl;
  130.         //cout<<"ei:"<<ei<<"ej:"<<ej<<endl;

  131.         
  132.         step=1;
  133.         memset(C,0,sizeof(C));
  134.         step=dfsVisit(si,sj,0,0);
  135.         cout<<step<<" ";

  136.         step=1;
  137.         memset(C,0,sizeof(C));
  138.         step=dfsVisit(si,sj,1,0);
  139.         cout<<step<<" ";
  140.         
  141.         step=bfs();
  142.         cout<<step;
  143.         cout<<endl;
  144.         
  145.     }
  146. }

阅读(14) | 评论(0) | 转发(0) |
0

上一篇:poj 3009 - Curling 2.0

下一篇:poj 2251

相关热门文章
  • linux 常见服务端口
  • 【ROOTFS搭建】busybox的httpd...
  • 什么是shell
  • linux socket的bug??
  • linux的线程是否受到了保护?...
  • cpu %和load average是怎样的...
  • 如何确定线程使用的端口...
  • mysql整形数据类型插入0001数...
  • weblogic集群下启动服务有一个...
  • Ajax 权限验证
给主人留下些什么吧!~~
原创粉丝点击