首页 > 其他 > 详细

六子冲 模拟棋盘

时间:2018-01-23 13:46:48      阅读:322      评论:0      收藏:0      [点我收藏+]

题目描述 

    六子冲是流传于中国民间的一类棋类游戏。由于这个游戏对环境的要求不高,孩子们大都是在光滑的地面或石板上画上方格,以石子或木棍、草节等为棋子,并有简单的比赛,可以锻炼脑力。

    纵横各四条直线组成一个正方形棋盘,直线相交的地方为落子点。开局时放子处为上下左右边线上的落子点,且不同方的子不可交叉放置。如下图:
技术分享图片

    棋子只能停留在棋盘上的落子点,棋子只能在线上移动,棋子只能移动一步(即相邻落子点),每回合只能移动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 }
View Code
https://www.nowcoder.com/acm/contest/67/C

六子冲 模拟棋盘

原文:https://www.cnblogs.com/carcar/p/8335130.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!