由于一开始考虑的很不周到,找到很多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 "); } else { printf("%d %d ",ans.x,ans.y); } } return 0; }