您的位置:首页 > 产品设计 > UI/UE

HDU 4740 The Donkey of Gui Zhou (模拟)

2013-09-16 19:28 453 查看
由于一开始考虑的很不周到,找到很多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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: