重构一遍就A了。。。但这样效率太低了。。。莫非都要重构???QWQ


每一秒男同志bfs3层,女同志bfs1层。注意扩展状态时,要判一下合不合法再扩展,而不是只判扩展的状态合不合法,否则有可能由非法的走到合法的地方。

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#define R register int
const int dx[]={-,,,},dy[]={,,,-};
using namespace std;
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
int n,m,t,tim,cc;
int gx,gy,mx,my,zx,zy,zx1,zy1;
char e[][];
inline int abs(int x) {return x>?x:-x;}
inline bool is(char ch) {return ch=='X'||ch=='Z'||ch=='M'||ch=='G'||ch=='.';}
inline bool ckpos(int x,int y) {
if(x<||x>n||y<||y>m||e[x][y]=='X') return false;
if(*tim>=abs(x-zx)+abs(y-zy)||*tim>=abs(x-zx1)+abs(y-zy1)) return false;
return true;
}
struct node{int x,y; node() {}
node(int xx,int yy) {x=xx,y=yy;}
};
queue<node>q,q1;
inline bool bfs() {
for(R x=;x<=;++x) { queue<node> qt=q; R sz=q.size();
while(sz--) {
node u=qt.front(); qt.pop(); R x=u.x,y=u.y;
if(!ckpos(x,y)) continue;
for(R i=;i<;++i) {
R xx=x+dx[i],yy=y+dy[i];
if(!ckpos(xx,yy)||e[xx][yy]=='M') continue;
if(e[xx][yy]=='G') return true; e[xx][yy]='M';
qt.push(node(xx,yy));
}
} q=qt;
} return false;
}
inline bool bfs1() { queue<node> qt=q1; R sz=q1.size();
while(sz--) {
node u=qt.front(); qt.pop(); R x=u.x,y=u.y;
if(!ckpos(x,y)) continue;
for(R i=;i<;++i) {
R xx=x+dx[i],yy=y+dy[i];
if(!ckpos(xx,yy)||e[xx][yy]=='G') continue;
if(e[xx][yy]=='M') return true; e[xx][yy]='G';
qt.push(node(xx,yy));
}
} q1=qt; return false;
}
signed main() {
t=g(); while(t--) { tim=; cc=;
n=g(),m=g();
for(R i=;i<=n;++i) for(R j=;j<=m;++j) {
while(!is(e[i][j]=getchar())); if(e[i][j]=='M') mx=i,my=j;
else if(e[i][j]=='G') gx=i,gy=j;
else if(e[i][j]=='Z') if(cc) zx1=i,zy1=j; else zx=i,zy=j,++cc;
} while(q.size()) q.pop(); while(q1.size()) q1.pop();
q.push(node(mx,my)); q1.push(node(gx,gy));
while(++tim) {
if(bfs()||bfs1()) {printf("%d\n",tim); break;}
if(q1.empty()||q.empty()) {printf("-1\n"); break;}
}
}
}

2019.04.27

最新文章

  1. Kylin查询性能低下原因分析
  2. [Effective JavaScript 笔记]第41条:将原型视为实现细节
  3. D3D9 浮点精度的问题
  4. thinkphp nginx 配置
  5. Response.Write用法总结
  6. 【算法Everyday】第二日 求子数组的最大和
  7. Linux开发工具之gdb(下)
  8. Autoit 获取运行目录
  9. 关于Thread的Runnable和Callable接口
  10. Java中有关日期的一些常见运算与应用(Date,DateFormat,SimpleDateFormat)
  11. Java并发框架——AQS阻塞队列管理(一)——自旋锁
  12. 2种方式解决vue路由跳转未匹配相应路由避免出现空白页面或者指定404页面
  13. 1060E Sergey and Subway(思维题,dfs)
  14. 【Python全栈-后端开发】嵩天老师-Django
  15. canvas交互部分
  16. wampserver下配置虚拟主机 实现多站点支持
  17. Java基础小结
  18. HBuilder 详细使用方法 -------------参考 :http://www.runoob.com/w3cnote/hbuilder-intro.html
  19. 【转】.NET 4.5 使用async和await关键字调用异步方法
  20. pipeline(管道的连续应用)

热门文章

  1. file_get_content() 超时
  2. 百度Ueditor编辑器取消多图上传对话框中的图片搜索
  3. java容器 Map Set List
  4. loj2512 [BJOI2018]链上二次求和
  5. jqgrid扩展 获取表单数据
  6. Python字符编码详解,str,bytes
  7. 现代C++学习笔记之二入门篇2,数据转换
  8. excel中的绝对引用和相对应用
  9. SqueezeNet:AlexNet-level Accuracy with 50x fewer parameters and less than 0.5Mb model size
  10. vee-validate表单校验的基本使用