• 象棋(模拟题)


    一、题目

    考虑一个残局,其中红方有n个棋子,黑方只有一个将,红方除了帅以外还有:车(R)、马(H)、炮(C)三种可能得棋子,并且考虑"蹩马脚"和将帅不能照面。输入所有棋子位置坐标,保证局面合法且红方已被将军。你任务是判断红方是否已被黑方将死。

    二、思路

    用两个二维数组,一个存所有棋子的位置,一个记录所有棋子的死伤范围。要考虑黑将吃子的情况(所以本身不能包括在杀伤范围内)。写3个杀伤函数(帅可以看作车),判断将向4个方向移动,是否有不再杀伤范围内的。

    三、代码

      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<iostream>
      4 using namespace std;
      5 char pieces[11][10];
      6 char range[11][10];
      7 int pos[8][3];
      8 
      9 void RG(int x, int y)
     10 {
     11     for (int i = x - 1; i >= 1; i--)
     12     {
     13         range[i][y] = 'S';
     14         if (pieces[i][y] != 'A' && pieces[i][y] != 'B')  break;
     15     }
     16     for (int i = x + 1; i <= 10; i++)
     17     {
     18         range[i][y] = 'S';
     19         if (pieces[i][y] != 'A' && pieces[i][y] != 'B')  break;
     20     }
     21     for (int i = y - 1; i >= 1; i--)
     22     {
     23         range[x][i] = 'S';
     24         if (pieces[x][i] != 'A' && pieces[x][i] != 'B')  break;
     25     }
     26     for (int i = y + 1; i <= 9; i++)
     27     {
     28         range[x][i] = 'S';
     29         if (pieces[x][i] != 'A' && pieces[x][i] != 'B')  break;
     30     }
     31 }
     32 void C(int x, int y)
     33 {
     34     int i, j;
     35     for (i = x-1; i >= 1; i--)
     36     {
     37         if (pieces[i][y] == 'B')  return;
     38         if (pieces[i][y] != 'A')  break;
     39     }
     40     for ( j = i-1; j >= 1; j--)
     41     {
     42         range[j][y] = 'S';
     43         if (pieces[j][y] != 'A' && pieces[j][y] != 'B')  break;
     44     }
     45     for (i = x + 1; i <= 10; i++)
     46     {
     47         if (pieces[i][y] == 'B')  return;
     48         if (pieces[i][y] != 'A')  break;
     49     }
     50     for (j = i + 1; j <= 10; j++)
     51     {
     52         range[j][y] = 'S';
     53         if (pieces[j][y] != 'A' && pieces[j][y] != 'B')  break;
     54     }
     55 
     56     for (i = y-1; i >= 1; i--)
     57     {
     58         if (pieces[x][i] == 'B')  return;
     59         if (pieces[x][i] != 'A')  break;
     60     }
     61     for ( j = i-1; j >= 1; j--)
     62     {
     63         range[x][j] = 'S';
     64         if (pieces[x][j] != 'A' && pieces[x][j] != 'B')  break;
     65     }
     66     for (i = y + 1; i <= 9; i++)
     67     {
     68         if (pieces[x][i] == 'B')  return;
     69         if (pieces[x][i] != 'A')  break;
     70     }
     71     for (j = i + 1; j <= 9; j++)
     72     {
     73         range[x][j] = 'S';
     74         if (pieces[x][j] != 'A' && pieces[x][j] != 'B')  break;
     75     }
     76 }
     77 void H(int x, int y)
     78 {
     79     if (y + 2 <= 9 && x - 1 >= 1 && pieces[x][y + 1] == 'A')   range[x - 1][y + 2] = 'S';
     80     if (y + 2 <= 9 && x + 1 <= 10 && pieces[x][y + 1] == 'A')   range[x + 1][y + 2] = 'S';
     81     if (y - 2 >= 1 && x - 1 >= 1 && pieces[x][y - 1] == 'A')   range[x - 1][y - 2] = 'S';
     82     if (y - 2 >= 1 && x + 1 <= 10 && pieces[x][y - 1] == 'A')   range[x + 1][y - 2] = 'S';
     83     if (x + 2 <= 10 && y - 1 >= 1 && pieces[x + 1][y] == 'A')   range[x + 2][y - 1] = 'S';
     84     if (x + 2 <= 10 && y + 1 <= 9 && pieces[x + 1][y] == 'A')   range[x + 2][y + 1] = 'S';
     85     if (x - 2 >= 1 && y - 1 >= 1 && pieces[x - 1][y] == 'A')   range[x - 2][y - 1] = 'S';
     86     if (x - 2 >= 1 && y + 1 <= 9 && pieces[x - 1][y] == 'A')   range[x - 2][y + 1] = 'S';
     87 }
     88 int judge(int x, int y)
     89 {
     90     int is_secure = 0;
     91     if (x + 1 <= 3 && range[x + 1][y] != 'S')  is_secure = 1;
     92     if (x - 1 >= 1 && range[x - 1][y] != 'S')  is_secure = 1;
     93     if (y + 1 <= 6 && range[x][y + 1] != 'S')  is_secure = 1;
     94     if (y - 1 >= 4 && range[x][y - 1] != 'S')  is_secure = 1;
     95     return is_secure;
     96 }
     97 
     98 int main()
     99 {
    100     int n, r, c;
    101     while (scanf("%d%d%d",&n,&r,&c) == 3 && n)
    102     {
    103         char ch[2];
    104         int r1, c1;
    105         memset(pieces, 'A', sizeof(pieces));
    106         memset(range, 'A', sizeof(range));
    107         memset(pos, 0, sizeof(pos));
    108         pieces[r][c] = 'B';
    109         for (int i = 0; i < n; i++)
    110         {
    111             scanf("%s", ch);
    112             scanf("%d%d", &r1, &c1);
    113             pieces[r1][c1] = ch[0];
    114             pos[i][0] = r1;
    115             pos[i][1] = c1;
    116         }
    117         for (int i = 0; i < n; i++)
    118         {
    119             int a = pos[i][0], b = pos[i][1];
    120             if (pieces[a][b] == 'R' || pieces[a][b] == 'G')  RG(a, b);
    121             else if (pieces[a][b] == 'H')  H(a, b);
    122             else if (pieces[a][b] == 'C')  C(a, b);
    123         }
    124         if (!judge(r, c))
    125             printf("YES
    ");
    126         else
    127             printf("NO
    ");
    128     }
    129     return 0;
    130 }

    代码写得比较长,感觉很多地方可以写成循环的形式,但现在的水平感觉不好写,哈哈,以后记得再补!

  • 相关阅读:
    杭州西郊千湖岛-天下第一秀水
    windows phone7 豆瓣FM
    wp7 中 HubTile控件自定义大小。
    wp7 HubTile
    Windows Phone 7之XNA游戏:重力感应
    WP7:模拟开始屏幕Tile漂动效果
    windows 8 项目
    手把手教你 用 wpf 制作metro ProgressRing (Windows8 等待动画)
    windows8 开发教程 教你制作 多点触控Helper可将任意容器内任意对象进行多点缩放
    仿windows8 开始菜单 实现HubTileBase 以及仿鲜果联播实现 PulsingTile(脉冲磁贴)
  • 原文地址:https://www.cnblogs.com/lfri/p/9357136.html
Copyright © 2020-2023  润新知