2013杭州网络赛C题HDU 4640(模拟)

20 0 00 1 240 1 03 2 00
-11 3
#include<iostream>#include<cstring>#include<string>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;int dir[4][2]= //往东南西北四个方向{ {0,1},{1,0},{0,-1},{-1,0}};int visidon[1005][1005];int visitig[1005][1005];int main(){ int n,i,j; int donx,dony,tigx,tigy,pdon,ptig; while(scanf("%d",&n)&&n) { memset(visidon,0,sizeof(visidon)); memset(visitig,0,sizeof(visitig)); scanf("%d%d%d",&donx,&dony,&pdon); //驴子的坐标与方向 scanf("%d%d%d",&tigx,&tigy,&ptig); //老虎的坐标与方向 visidon[donx][dony]=1; visitig[tigx][tigy]=1; int flag=0; int fla1=0,fla2=0;//代表驴子和老虎不能转向 if(donx==tigx&&dony==tigy) //开始就在一起,直接输出 { cout<<donx<<" "<<dony<<endl; continue; } else { while(1) { if(fla1&&fla2) { break; } int cx1,cy1,cx2,cy2; cx1=donx,cy1=dony,cx2=tigx,cy2=tigy; if(!fla1) //驴子还可以走 { cx1=donx+dir[pdon][0]; cy1=dony+dir[pdon][1]; } if(!fla2) //老虎还可以走 { cx2=tigx+dir[ptig][0]; cy2=tigy+dir[ptig][1]; } if(!fla1) //驴子还可以走 { if(cx1>=0&&cx1<n&&cy1>=0&&cy1<n&&!visidon[cx1][cy1]) //可以沿着方向走 { donx=donx+dir[pdon][0]; dony=dony+dir[pdon][1]; visidon[donx][dony]=1; //cout<<"驴子:"<<donx<<" "<<dony<<endl; } else //转了一次方向 { pdon=(pdon+1+4)%4; cx1=donx+dir[pdon][0]; cy1=dony+dir[pdon][1]; if(cx1>=0&&cx1<n&&cy1>=0&&cy1<n&&!visidon[cx1][cy1]) //可以沿着方向走 { donx=donx+dir[pdon][0]; dony=dony+dir[pdon][1]; visidon[donx][dony]=1; //cout<<"驴子:"<<donx<<" "<<dony<<endl; } else fla1=1; //转了一次方向还是不能走,那就停下来 } } if(!fla2) //老虎还可以走 { if(cx2>=0&&cx2<n&&cy2>=0&&cy2<n&&!visitig[cx2][cy2]) { tigx=tigx+dir[ptig][0]; tigy=tigy+dir[ptig][1]; visitig[tigx][tigy]=1; //cout<<"老虎:"<<tigx<<" "<<tigy<<endl; } else { ptig=(ptig-1+4)%4; cx2=tigx+dir[ptig][0]; cy2=tigy+dir[ptig][1]; if(cx2>=0&&cx2<n&&cy2>=0&&cy2<n&&!visitig[cx2][cy2]) { tigx=tigx+dir[ptig][0]; tigy=tigy+dir[ptig][1]; visitig[tigx][tigy]=1; //cout<<"老虎:"<<tigx<<" "<<tigy<<endl; } else fla2=1; } } if(donx==tigx&&dony==tigy) //说明撞在一起 { flag=1; break; } } if(!flag) puts("-1"); else { printf("%d %d\n",donx,dony); } } } return 0;}