由于一开始考虑的很不周到,找到很多bug.....越改越长,不忍直视。 不是写模拟的料......................

反正撞墙或者碰到已经走过的点就会转向,转向后还碰到这两种情况就会傻站那不动了......

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <climits>//形如INT_MAX一类的
#define MAX 1111 using namespace std; int vis1[MAX][MAX];
int vis2[MAX][MAX];
int step1[MAX][MAX];
int step2[MAX][MAX];
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
struct node {
int x,y,dir,kind;
} q[1011111],st,end,ans,stop;
int head,tail,n,yes;
int flag1 , flag2; bool inside(int x,int y) {
if(x >= 0 && x < n && y >= 0 && y < n) return true;
return false;
} bool ok(int x,int y,int kind) {
if(kind == 1 && vis1[x][y] == 0) return true;
if(kind == 2 && vis2[x][y] == 0) return true;
return false;
} void init() {
memset(vis1,0,sizeof(vis1));
memset(vis2,0,sizeof(vis2));
memset(step1,-1,sizeof(step1));
memset(step2,-1,sizeof(step2));
head = 0;
tail = 0;
yes = 0;
flag1 = 0;
flag2 = 0;
stop.x = -1;
stop.y = -1;
} void getstop(node t,node tt) {
stop.x = t.x;
stop.y = t.y;
if(tt.kind == 1) flag1 = 1,stop.kind = 1;
if(tt.kind == 2) flag2 = 1,stop.kind = 2;
} void bfs() {
vis1[st.x][st.y] = 1;
vis2[end.x][end.y] = 1;
step1[st.x][st.y] = 0;
step2[end.x][end.y] = 0;
q[head++] = st;
q[head++] = end;
while(head != tail) {
node t = q[tail++];
//cout << t.x << ' ' << t.y << endl;
if(step1[t.x][t.y] == step2[t.x][t.y] && step1[t.x][t.y] != -1) {
ans.x = t.x;
ans.y = t.y;
yes = 1;
return ;
}
if(t.x == stop.x && t.y == stop.y && t.kind != stop.kind) {
ans.x = t.x;
ans.y = t.y;
yes = 1;
return ;
}
if(flag1 == 1 && flag2 == 1) {
ans.x = -1;
return ;
}
node tt = t;
tt.x = t.x + dx[t.dir];
tt.y = t.y + dy[t.dir]; if(inside(tt.x,tt.y)) {
if(ok(tt.x,tt.y,tt.kind)) {
if(tt.kind == 1) vis1[tt.x][tt.y] = 1, step1[tt.x][tt.y] = step1[t.x][t.y] + 1;
if(tt.kind == 2) vis2[tt.x][tt.y] = 1, step2[tt.x][tt.y] = step2[t.x][t.y] + 1;
q[head++] = tt;
} else {
if(tt.kind == 1) {
if(tt.dir == 3) tt.dir = 0;
else tt.dir ++;
tt.x = t.x + dx[tt.dir];
tt.y = t.y + dy[tt.dir];
if(vis1[tt.x][tt.y] == 0) {
vis1[tt.x][tt.y] = 1;
step1[tt.x][tt.y] = step1[t.x][t.y] + 1;
q[head++] = tt;
} else getstop(t,tt); }
if(tt.kind == 2) {
if(tt.dir == 0) tt.dir = 3;
else tt.dir --;
tt.x = t.x + dx[tt.dir];
tt.y = t.y + dy[tt.dir];
if(vis2[tt.x][tt.y] == 0) {
vis2[tt.x][tt.y] = 1;
step2[tt.x][tt.y] = step2[t.x][t.y] + 1;
q[head++] = tt;
} else getstop(t,tt);
}
}
} else {
if(tt.x < 0) {
if(tt.kind == 1) {
tt.dir = 0;
tt.x = t.x + dx[0];
tt.y = t.y + dy[0];
} else {
tt.dir = 2;
tt.x = t.x + dx[2];
tt.y = t.y + dy[2];
}
} else if(tt.x >= n) {
if(tt.kind == 1) {
tt.dir = 2;
tt.x = t.x + dx[2];
tt.y = t.y + dy[2];
} else {
tt.dir = 0;
tt.x = t.x + dx[0];
tt.y = t.y + dy[0];
}
} else if(tt.y < 0) {
if(tt.kind == 1) {
tt.dir = 3;
tt.x = t.x + dx[3];
tt.y = t.y + dy[3];
} else {
tt.dir = 1;
tt.x = t.x + dx[1];
tt.y = t.y + dy[1];
}
} else if(tt.y >= n) {
if(tt.kind == 1) {
tt.dir = 1;
tt.x = t.x + dx[1];
tt.y = t.y + dy[1];
} else {
tt.dir = 3;
tt.x = t.x + dx[3];
tt.y = t.y + dy[3];
}
}
if(inside(tt.x,tt.y)) {
if(ok(tt.x,tt.y,tt.kind)) {
if(tt.kind == 1) vis1[tt.x][tt.y] = 1, step1[tt.x][tt.y] = step1[t.x][t.y] + 1;
if(tt.kind == 2) vis2[tt.x][tt.y] = 1, step2[tt.x][tt.y] = step2[t.x][t.y] + 1;
q[head++] = tt;
} else getstop(t,tt); } else getstop(t,tt);
}
}
} int main() {
while(scanf("%d",&n) && n) {
init();
scanf("%d%d%d",&st.x,&st.y,&st.dir);
st.kind = 1;
scanf("%d%d%d",&end.x,&end.y,&end.dir);
end.kind = 2; bfs();
if(ans.x == -1 || yes == 0) {
printf("-1\n");
} else {
printf("%d %d\n",ans.x,ans.y);
}
}
return 0;
}

最新文章

  1. .NET 动态脚本语言Script.NET 入门指南 Quick Start
  2. 看开源代码利器—用Graphviz + CodeViz生成C/C++函数调用图(call graph)
  3. vmware ubuntu server 联网
  4. VS2010 常用快捷键
  5. POJ 2386 Lake Counting
  6. hdu 3859 Inverting Cups
  7. 【转载】java数据库操作
  8. Springmvc中@RequestParam传值中文乱码解决方案(转)
  9. (原+转)ubuntu16中莫名死机及重新安装显卡驱动
  10. 7. Shell 脚本编写
  11. PHP微信支付开发之扫描支付(模式二)后如何回调
  12. R语言数据框中,用0替代NA缺失值
  13. Hbase 技术细节笔记(下)
  14. week01-绪论
  15. [android]android下apk的安装过程
  16. java8的新特性详解-----------Lamda表达式
  17. CSS 颜色术语
  18. 配置Codis-Service主机
  19. spring boot整合Swagger2
  20. docker 微镜像-alpine

热门文章

  1. Android 数据库ORM框架GreenDao学习心得及使用总结&lt;一&gt;
  2. Android IT资讯网络阅读器应用源码
  3. Scala写排序可以说是简洁又明了
  4. Generator &amp; Co
  5. git/github 笔记
  6. 帝国cms &lt;!--list.var1--&gt;产生不同样式
  7. sim卡中的汉字存储格式
  8. ubuntu13.04安装SenchaArchitect-2.2无法启动的问题
  9. mac下通过xcodebuild使用oclint
  10. (十一年)unity4.6得知Ugui中国文献-------参考-UGUI Visual Components