题意:驴跟老虎一起走,问什么时候能相遇
题目的意思是在一个地方只能转一次弯。。坑了好长时间
代码如下:
#include <cstring>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <map>
#include <string>
#include <queue>
#include <bitset>
using namespace std;
const int dir[4][2]={0,1,1,0,0,-1,-1,0};
int n;
bool judge(int x,int y)
{
if(x<0||x>=n)return false;
if(y<0||y>=n)return false;
return true;
}
struct Pos
{
int x,y;
};
Pos don;
int dd;
Pos tir;
int td;
bool visd[1005][1005];
bool vist[1005][1005];
bool solve()
{
memset(visd,0,sizeof(visd));
memset(vist,0,sizeof(vist));
visd[don.x][don.y]=1;
vist[tir.x][tir.y]=1;
bool cantir=1;
bool candon=1;
while(cantir||candon){
// cout<<don.x<<' '<<don.y<<' '<<tir.x<<' '<<tir.y<<endl;
if(don.x==tir.x&&don.y==tir.y){ printf("%d %d\n",don.x,don.y);return true;}
if(candon){
Pos to;
to.x=don.x+dir[dd][0];
to.y=don.y+dir[dd][1];
if(judge(to.x,to.y)&&!visd[to.x][to.y]){
don.x=to.x;don.y=to.y;
visd[don.x][don.y]=1;
} else {
dd=(dd+1)%4;
to.x=don.x+dir[dd][0];
to.y=don.y+dir[dd][1];
if(judge(to.x,to.y)&&!visd[to.x][to.y]){
don.x=to.x;don.y=to.y;
visd[don.x][don.y]=1;
} else {
candon=0;
}
// if(pre==dd){candon=0;break;}
}
}
if(cantir){
Pos to;
to.x=tir.x+dir[td][0];
to.y=tir.y+dir[td][1];
if(judge(to.x,to.y)&&!vist[to.x][to.y]){
tir.x=to.x;tir.y=to.y;
vist[tir.x][tir.y]=1;
} else {
td=td-1;
if(td == -1)td=3;
to.x=tir.x+dir[td][0];
to.y=tir.y+dir[td][1];
if(judge(to.x,to.y)&&!vist[to.x][to.y]){
tir.x=to.x;tir.y=to.y;
vist[tir.x][tir.y]=1;
} else cantir=0;
// if(pre==td){cantir=0;break;}
}
}
if(don.x==tir.x&&don.y==tir.y){ printf("%d %d\n",don.x,don.y);return true;}
}
return false;
}
int main()
{
// freopen("data.txt","r",stdin);
while(scanf("%d",&n)!=EOF&&n){
scanf("%d%d%d",&don.x,&don.y,&dd);
scanf("%d%d%d",&tir.x,&tir.y,&td);
if(!solve()){
puts("-1");
}
}
return 0;
}