poj 3083
来源:互联网 发布:仓廪实而知礼节 编辑:程序博客网 时间:2024/06/06 12:26
刚开始提交的时候,超时,以为是stl queue的原因,把queue改成数组,结果还是超时,一直再找原因,后来将普通递归(非尾递归)改成尾递归的形式,就AC 了。
点击(此处)折叠或打开
- #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;
-
- }
- }
0
上一篇:poj 3009 - Curling 2.0
下一篇:poj 2251
相关热门文章
- linux 常见服务端口
- 【ROOTFS搭建】busybox的httpd...
- 什么是shell
- linux socket的bug??
- linux的线程是否受到了保护?...
- cpu %和load average是怎样的...
- 如何确定线程使用的端口...
- mysql整形数据类型插入0001数...
- weblogic集群下启动服务有一个...
- Ajax 权限验证
给主人留下些什么吧!~~
评论热议
- POJ 3083
- poj 3083
- POJ 3083
- poj 3083
- poj 3083
- poj 3083
- poj.3083
- POJ 3083
- POJ 3083
- poj-3083
- poj 3083
- poj 3083
- POJ -3083
- poj 3083
- POJ 3083
- POJ 3083 BFS
- poj 3083 TLE
- poj 3083 搜索
- poj 1125
- poj 2240
- poj 2488
- poj 1321
- poj 3009 - Curling 2.0
- poj 3083
- HDU 4403 A very hard Aoshu problem
- jquery & js 获取浏览器、屏幕高度
- poj 2251
- 算法导论 DP 矩阵链乘法
- jquery控制动态生成的gridview中多列checkbox的全选反选及自动判断是否全选状态
- (apple官方文档译文)表视图样式和扩展视图-Table View Styles and Accessory Views
- UIViewController的跳转方式
- CodeForces 141B - Hopscotch
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
读一本好书读后感
好书推荐手抄报图片
推荐好书手抄报
好书伴我成长
好书推荐图片
推荐一本好书手抄报
值得一看好书
暑假读一本好书征文
推荐几本好书
小学生好书推荐
儿童读物好书推荐
经典好书推荐排行榜
好书伴我成长作文
仙草级的好书
值得一看的好书排名
值得推荐的好书
值得一看的好书
推荐几本好书充实自己
经典好书推荐及理由
经典好书推荐
中国好书推荐排行榜
儿童好书推荐
推荐一些好书
值得看的好书
值得读的好书
值得一看的书
畅销书
推荐读书
书推荐
畅销书排行榜
推荐书籍及理由
推荐书目及理由
经典名著推荐
书推荐排行榜
值得看的书籍
经典书籍推荐
好看的书籍排行榜
必看书籍
读书推荐
创业经商必看书籍
高中生必读