zoukankan      html  css  js  c++  java
  • 六子冲 模拟棋盘

    题目描述 

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

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

        棋子只能停留在棋盘上的落子点,棋子只能在线上移动,棋子只能移动一步(即相邻落子点),每回合只能移动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:
    ",cou++);
    60          for(j=0;j<4;j++)
    61          {
    62              for(k=0;k<4;k++)
    63          printf("%3d",map2[j][k]);
    64          printf("
    ");
    65          }
    66      }
    67 
    68     return 0;
    69 }
    View Code
    https://www.nowcoder.com/acm/contest/67/C
  • 相关阅读:
    vue 防抖 节流
    数组取最小数据长度,确定长度截取,看是否全等 ,全等通过不等提示,需要拆分
    数组去重取不重复的数据
    vue
    vue2.0 子组件获取父组件值 使用v-model可渲染不能更改
    使用mpvue 开发小程序 遇到的坑
    ztree 样式更改
    vue 跨域请求
    记录 vue2.0 再使用过程中遇到的问题
    bug
  • 原文地址:https://www.cnblogs.com/carcar/p/8335130.html
Copyright © 2011-2022 走看看