题意:跳棋= =,但是只要中间棋子对称就可以跳,不能拿别人的棋子!!没有棋子也不能走!!
题解:大模拟= =。
AC代码:
#include<stdio.h>
#include<map>
#include<string>
#include<string.h>
#include<iostream>
using namespace std;
int start[18]={0,12,11,10,9,0,1,2,3,4,3,2,1,0,9,10,11,12};
int have[18]={0,1,2,3,4,13,12,11,10,9,10,11,12,13,4,3,2,1};
int zhongs[18]={0,0,0,0,0,5,4,3,2,1,2,3,4,5,0,0,0,0};
int zhonge[18]={0,0,0,0,0,9,9,9,9,9,9,9,9,9,0,0,0,0};
int dui[7]={0,6,5,4,3,2,1};
int mark[30][30];
int mp[30][30];
int ans[6]={1,6,4,3,5,2};
int gety(int s,int num)
{
return s+2*num-2;
}
int fangety(int x,int y)
{
return (y+2-start[x]-1)/2;
}
void pout()
{
for(int i=1;i<=17;i++)
{
for(int j=1;j<30;j++)
{
if(mark[i][j]==-1)
printf(" ");
else printf("%d",mark[i][j]);
}
printf("\n");
}
}
int dir[6][2]={
{0,-2},
{-1,-1},
{-1,1},
{0,2},
{1,1},
{1,-1}
};
map<string,int>mpp;
bool judge(int sx,int sy,int ex,int ey,int di,int step)
{
if(step<1)return false;
int f=0;
int nowx=sx,nowy=sy;
while(nowx!=ex||nowy!=ey)
{
if(mp[nowx][nowy]||mp[ex][ey])f=1;
nowx+=dir[di][0];
nowy+=dir[di][1];
}
if(mp[nowx][nowy]||mp[ex][ey])f=1;
for(int i=0;i<step/2;i++)
{
if((!!mp[sx][sy])!=(!!mp[ex][ey]))
return false;
sx+=dir[di][0];
sy+=dir[di][1];
ex-=dir[di][0];
ey-=dir[di][1];
}
if(f)return true;
else return false;
}
int col(int x,int y)
{
if(x<=4)return 1;
if(x>13)return 6;
if(x>=5&&x<=8&&y<=10)return 2;
if(x>=5&&x<=8&&y>18)return 3;
if(x>=10&&x<=13&&y<=10)return 4;
if(x>=10&&x<=13&&y>18)return 5;
}
int main()
{
//printf("%d\n",gety(start[0]+1,have[0]));
int n;
while(~scanf("%d",&n))
{
memset(mark,-1,sizeof(mark));
mpp["L"]=0;
mpp["UL"]=1;
mpp["UR"]=2;
mpp["R"]=3;
mpp["LR"]=4;
mpp["LL"]=5;
for(int i=1;i<=17;i++)
for(int j=1;j<30;j++)
{
if(!(j>start[i]&&j<=gety(start[i]+1,have[i])))
mark[i][j]=-1;
else mark[i][j]=0;
}
for(int i=1;i<=17;i++)
{
for(int j=1;j<=have[i];j++)
{
int y=gety(start[i]+1,j);
mark[i][y]=col(i,y);
mp[i][y]=col(i,y);
if(zhongs[i]<=j&&j<=zhonge[i])
{
mark[i][y]=0;
mp[i][y]=0;
}
}
}
int fuck=-1;
while(n--)
{
fuck=(fuck+1)%6;
//pout();
int x,y;
string A;
scanf("%d%d",&x,&y);
cin>>A;
int di=mpp[A];
int nowx=x;
int nowy=gety(start[x]+1,y);
int step=0;
int dx=nowx,dy=nowy;
if(mp[dx][dy]!=ans[fuck])continue;
int hax=-1,hay=-1;
while(mark[dx+dir[di][0]][dy+dir[di][1]]!=-1)
{
step++;
dx+=dir[di][0];
dy+=dir[di][1];
if((judge(nowx+dir[di][0],nowy+dir[di][1],dx-dir[di][0],dy-dir[di][1],di,step-1)||step==1)&&mp[dx][dy]==0)
{
if(mark[dx][dy]!=0)
{
if(dui[mp[nowx][nowy]]==mark[dx][dy]||mp[nowx][nowy]==mark[dx][dy])
hax=dx,hay=dy;
}
else hax=dx,hay=dy;
}
}
if(hax==-1)continue;
swap(mp[nowx][nowy],mp[hax][hay]);
}
for(int k=0;k<6;k++)
{
int num=ans[k];
int sum=0;
for(int i=0;i<30;i++)
for(int j=0;j<30;j++)
if(mp[i][j]==num)
{
sum++;
if(sum==10)printf("%d %d\n",i,fangety(i,j));
else printf("%d %d ",i,fangety(i,j));
}
}
//pout();
}
}