题目描述
六子冲是流传于中国民间的一类棋类游戏。由于这个游戏对环境的要求不高,孩子们大都是在光滑的地面或石板上画上方格,以石子或木棍、草节等为棋子,并有简单的比赛,可以锻炼脑力。
纵横各四条直线组成一个正方形棋盘,直线相交的地方为落子点。开局时放子处为上下左右边线上的落子点,且不同方的子不可交叉放置。如下图:
棋子只能停留在棋盘上的落子点,棋子只能在线上移动,棋子只能移动一步(即相邻落子点),每回合只能移动1个棋子。消灭对方棋子的方法只有一条,也很简单。那就是:二子打一子。即在棋盘上攻击方的2个棋子(2子必须相连并主动移动其中的1个)与被攻方的1个棋子皆处在一条直线上并相邻时,被攻方的这个棋子就被消灭。双方轮流走子,保护自己的棋子并消灭所有对方的棋子,直到最后胜利。
吃子例与错误吃子例如下图所示:
现为双方棋子赋予编号1~12。1~6号为黑方棋子,7~12号为白方棋子。其初始位置如下:
用两个整数,来代表走子方式。第一个数q代表棋子的编号,第二个数p,代表走子的方向。1<=q<=12,1<=p<=4,其中q的数字对应棋子的编号,p为1时向上走子,p为2时向下,3为向左,4为向右。给你n步走子方式,求最后棋盘的局面。
输入描述:
数据有多组,处理到文件结束。
第一行一个数n,代表走子步数。
接下来n行,每行两个整数,第一个数q代表棋子的编号,第二个数p,代表走子的方向。
输出描述:
每组数据第一行输出“#Case i:”并换行,其中i为测试用例编号,从1开始。
接着输出一个4*4的矩阵,代表棋盘局面的情况,4*4的矩阵代表棋盘上的4*4个棋位,矩阵的元素,即是棋盘上对应的棋子编号,没有棋子为0。输出的数字以3位的位宽输出。
示例1
输入
8 7 3 6 1 12 4 1 1 12 2 2 1 10 2 4 1
输出
#Case 1: 0 0 9 8 0 10 7 0 2 12 4 0 0 0 0 5
说明
注意,输出的每一个棋子编号,都应是位宽为3的。最后的输出效果,每个数字都右对齐。如果网页显示有误或者描述不够清晰,请看下面:
**0**0**9**8
**0*10**7**0
**2*12**4**0
**0**0**0**5
上面的‘*’对应输出样例中的空格。所有数据的结果,请按上面的格式输出。
在实际测试数据中,会存在让子的情况。即有可能出现一方玩家连续走子多次的情况。
备注:
对于100%的数据,
1 <= n <= 1000;
1 <= q <= 12;
1 <= p <= 4。
这种题目比较繁琐,有时候用大量的重复代码反而更快写出来,因为格子比较少,容易用代码枚举各种情况
我的思路
先让子跳到目标位置,再判断这个子是否可以吃对方的子
吃子的情况只有四种p代表刚走完的子的一方,-p代表敌对方,0代表没子
分为x轴吃
0 p p -p 吃4号子
0 -p p p 吃2号子
-p p p 0 吃1号子
p p -p 0 吃3号子
和y轴同理;
下面是代码
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 int map[4][4]= 5 { 6 {11,10,9,8}, 7 {12,0,0,7 }, 8 {1,0,0,6 }, 9 {2,3,4,5 } 10 }; 11 int wo[4][4]= 12 { 13 {1,1,1,1}, 14 {1,0,0,1 }, 15 {-1,0,0,-1}, 16 {-1,-1,-1,-1} 17 }; 18 int map2[4][4],wo2[4][4]; 19 int xx[]={0,0,-1,1}; 20 int yy[]={-1,1,0,0}; 21 int find(int x,int y,int p) 22 { 23 if(wo2[y][0]==0&&wo2[y][1]==p&&wo2[y][2]==p&&wo2[y][3]==-p) map2[y][3]=0,wo2[y][3]=0; 24 else if(wo2[y][0]==0&&wo2[y][1]==-p&&wo2[y][2]==p&&wo2[y][3]==p) map2[y][1]=0,wo2[y][1]=0; 25 else if(wo2[y][0]==-p&&wo2[y][1]==p&&wo2[y][2]==p&&wo2[y][3]==0) map2[y][0]=0,wo2[y][0]=0; 26 else if(wo2[y][0]==p&&wo2[y][1]==p&&wo2[y][2]==-p&&wo2[y][3]==0) map2[y][2]=0,wo2[y][2]=0; 27 28 if(wo2[0][x]==0&&wo2[1][x]==p&&wo2[2][x]==p&&wo2[3][x]==-p) map2[3][x]=0,wo2[3][x]=0; 29 else if(wo2[0][x]==p&&wo2[1][x]==p&&wo2[2][x]==-p&&wo2[3][x]==0) map2[2][x]=0,wo2[2][x]=0; 30 else if(wo2[0][x]==0&&wo2[1][x]==-p&&wo2[2][x]==p&&wo2[3][x]==p) map2[1][x]=0,wo2[1][x]=0; 31 else if(wo2[0][x]==-p&&wo2[1][x]==p&&wo2[2][x]==p&&wo2[3][x]==0) map2[0][x]=0,wo2[0][x]=0; 32 return 1; 33 } 34 int main() 35 { 36 int a,b,n,i,x,y,j,k,cou=1;; 37 while(scanf("%d",&n)==1) 38 { 39 40 memcpy(map2,map,sizeof(map)); 41 memcpy(wo2,wo,sizeof(wo)); 42 for(i=0;i<n;i++) 43 { 44 scanf("%d %d",&a,&b); 45 for(j=0;j<4;j++) 46 for(k=0;k<4;k++) 47 { 48 if(map2[j][k]==a) 49 { 50 x=k,y=j; 51 } 52 } 53 map2[y+yy[b-1]][x+xx[b-1]]=map2[y][x]; 54 wo2[y+yy[b-1]][x+xx[b-1]]=wo2[y][x]; 55 map2[y][x]=0;wo2[y][x]=0; 56 find(x+xx[b-1],y+yy[b-1],wo2[y+yy[b-1]][x+xx[b-1]]); 57 58 } 59 printf("#Case %d:\n",cou++); 60 for(j=0;j<4;j++) 61 { 62 for(k=0;k<4;k++) 63 printf("%3d",map2[j][k]); 64 printf("\n"); 65 } 66 } 67 68 return 0; 69 }
https://www.nowcoder.com/acm/contest/67/C