hihocoder 1630 Chinese Checkers [大模拟]

来源:互联网 发布:网络推广术语 编辑:程序博客网 时间:2024/04/28 09:42

题意:跳棋= =,但是只要中间棋子对称就可以跳,不能拿别人的棋子!!没有棋子也不能走!!

题解:大模拟= =。

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();}}


原创粉丝点击