2014-01-06
■ JOI Messenger
基本方針:
A: (2,x)に向かって突き進む。(2,x)にきたら伝播開始。
次のbitが0なら(1,x)をぐるぐるして、1なら(3,x)をぐるぐるする。
Bが(2,x)に戻し、まだ送るべきbitがあるなら上の操作を繰り返す。
そうでないときは同じところをぐるぐる。
B: 5回ターンが回ってくるまでは何もしない。(適当にぐるぐる)
5回目以降は(1,x)なら*2 ,(3,x)なら*2+1 ,(2,x)なら伝播終了。
いずれの場合も(2,x)に戻す。あとは適当にぐるぐるする。
面白い問題だと思いました。
//Daily Lunch Special Tanoshii !! #include "grader.h" #include#include #include using namespace std; #define pb push_back int cur=0; bool beg=false; vector<int>bit; int prex=-1,prey=-1; int pre2x=-1,pre2y=-1; bool mov=false; static int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; void InitA(int T,int X) { while(X) { bit.pb((X%2)); X/=2; } reverse(bit.begin(),bit.end()); } int GameA(int I,int J) { int a=I,b=J,ret; mov=false; if(prex!=a || prey!=b) { if(prex!=-1) mov=true; } if(mov || prex==-1) { pre2x=a; pre2y=b; } if(!beg) { if(a>=3) ret=-1; if(a==1) ret=-2; if(a==2) { beg=true; if(!bit[cur]) ret=-1; else ret=-2; } } else { if(a==2 && mov && cur!=bit.size()-1) { cur++; if(!bit[cur]) ret=-1; else ret=-2; } else { if(b==1) ret=-4; if(b==4) ret=-3; if(b==2) {if(pre2x==a && pre2y==3) ret=-3;else ret=-4;} if(b==3) {if(pre2x==a && pre2y==2) ret=-4;else ret=-3;} } } prex=a+dx[ret+4]; prey=b+dy[ret+4]; return ret; } void InitB(int T){} int zx=-1,zy=-1; int z2x=-1,z2y=-1; int v=0; bool move2; int res=0; int GameB(int I,int J) { int a=I,b=J,ret; move2=false; if(zx!=a || zy!=b) { move2=true; v++; zx=a; zy=b; z2x=a; z2y=b; } if(v<5 || !move2) { if(b==1) ret=-4; if(b==4) ret=-3; if(b==2) {if(z2x==a && z2y==3) ret=-3;else ret=-4;} if(b==3) {if(z2x==a && z2y==2) ret=-4;else ret=-3;} } else { if(a==1) {res*=2;ret=-2;} if(a==3) {res=(res*2+1); ret=-1;} if(a==2) ret=res; } if(ret<0) {zx=a+dx[ret+4]; zy=b+dy[ret+4];} return ret; }