刚开始提交的时候,超时,以为是stl queue的原因,把queue改成数组,结果还是超时,一直再找原因,后来将普通递归(非尾递归)改成尾递归的形式,就AC 了。
阅读(14) | 评论(0) | 转发(0) |
<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
点击(此处)折叠或打开
- #include <iostream>
- #include <stdio.h>
- #include<cstring>
- #include<queue>
-
- using namespace std;
-
- struct move{
- int i;
- int j;
- }MOVE[4] = {{-1,0} , {0,1},{1,0},{0,-1}};
-
- int n,p,q,step;
- int si,sj,ei,ej;
- #define MAX_V (40+1)
-
- char T[MAX_V][MAX_V];
- char C[MAX_V][MAX_V];
-
- int isValid(int i,int j)
- {
- if ( i< 1 || i> q)
- return 0;
- if( j< 1 || j> p)
- return 0;
-
- return 1;
- }
-
- struct qv
- {
- int i;
- int j;
- int l;
- }PT[500000];
-
-
-
- int bfs()
- {
- memset(C,0,sizeof(C));
- int h=0;
- int t=1;
-
- PT[h].i=si;
- PT[h].j=sj;
- PT[h].l=1;
-
- while(h < t)
- {
- struct qv pt = PT[h];
- h++;
-
- //cout<<"h:"<<h<<endl;
- for(int m=0;m<4;m++)
- {
-
- int mi = pt.i + MOVE[m].i;
- int mj = pt.j + MOVE[m].j;
-
- if( !isValid(mi,mj))
- continue;
-
- if(C[mi][mj] != 0)
- continue;
- if(T[mi][mj] == 'E')
- return pt.l +1;
-
- if(T[mi][mj] == '.')
- {
- PT[t].i = mi;
- PT[t].j = mj;
- PT[t].l = pt.l +1;
- C[mi][mj]=1;
-
- t++;
- }
- }
- }
-
- return 0;
- }
-
- int dfsVisit(int i,int j,int rfirst,int d) //d代表方向,从哪个方向来的 rfirst代表右优先,还是左优先
- {
- int start,mm,mi,mj;
-
- if(T[i][j] == 'E')
- return 1;
-
- if(!rfirst)
- start = d-1;
- else
- start = d+1;
-
- for( int c=0;c< 4;c++)
- {
- if(!rfirst)
- mm = start +c;
- else
- mm=start -c;
-
-
- //printf("before mm=%d \n",mm);
- if(mm < 0)
- mm += 4;
-
- if(mm > 3)
- mm -= 4;
-
- mi = i + MOVE[mm].i;
- mj = j + MOVE[mm].j;
-
- //printf("after mm=%d (%d,%d)->(%d,%d)\n",mm,i,j,mi,mj);
-
- //printf("\tm=%d mm=%d,mi=%d,mj=%d\n",m,mm,mi,mj);
- if ( !isValid(mi,mj) )
- {
- //printf("mi=%d mj=%d non valid\n",mi,mj);
- continue;
- }
-
- if( T[mi][mj] == '#' )
- {
- continue;
- }
-
- break;
- }
-
-
- return dfsVisit(mi,mj,rfirst,mm)+1;
- }
-
- int main()
- {
- cin>>n;
-
- for(int k=1;k<=n;k++)
- {
- cin>>p>>q;
- for(int i=1;i<=q;i++)
- {
- for(int j=1;j<=p;j++)
- {
- cin>>T[i][j];
- if(T[i][j] == 'S')
- {
- si=i;
- sj=j;
- }
- else if (T[i][j] == 'E')
- {
- ei=i;
- ej=j;
- }
- }
- }
- //cout<<"si:"<<si<<"sj:"<<sj<<endl;
- //cout<<"ei:"<<ei<<"ej:"<<ej<<endl;
-
-
- step=1;
- memset(C,0,sizeof(C));
- step=dfsVisit(si,sj,0,0);
- cout<<step<<" ";
-
- step=1;
- memset(C,0,sizeof(C));
- step=dfsVisit(si,sj,1,0);
- cout<<step<<" ";
-
- step=bfs();
- cout<<step;
- cout<<endl;
-
- }
- }
相关热门文章
给主人留下些什么吧!~~
评论热议