uva 1589 by sixleaves

坑爹的模拟题目。自己对于这种比较复杂点得模拟题的能力概述还不够,还多加练习。贴别是做得时候一直再想如何检查车中间有没有棋子,炮中间有没有棋子。到网上参考别人的代码才发先这么简单的办法,自己尽然想不到。多加练习,总结下该题目吧。

  1 #include <stdio.h>
  2 #include <string.h>
  3 #define N 12
  4 
  5 char brd[N][N];
  6 int dx[] = {1,-1,0,0}, dy[] = {0,0,1,-1};
  7 int hx[] = {-2,-1,-2,-1,1,2,1,2};
  8 int hy[] = {-1,-2,1,2,-2,-1,2,1};
  9 int tx[] = {-1,-1,-1,-1,1,1,1,1};
 10 int ty[] = {-1,-1,1,1,-1,-1,1,1};
 11 int cr[2], cc[2];
 12 
 13 
 14 int check(int, int);
 15 
 16 int main() {
 17     
 18     int t, bX, bY;
 19     char s[5];
 20     while (scanf("%d%d%d",&t, &bX, &bY), t || bX || bY) {
 21         
 22         memset(brd, 0, sizeof(brd));
 23         cr[0] = cc[0] = cr[1] = cc[1] = 0;
 24         
 25         for (int i = 0; i < t; i++) {
 26             
 27             int rX, rY;
 28             scanf("%s%d%d", s, &rX, &rY);
 29             if (‘C‘ == s[0]) {
 30                 
 31                 if (cr[0]) cr[1] = rX, cc[1] = rY;
 32                 else cr[0] = rX, cc[0] = rY;
 33             }
 34             brd[rX][rY] = s[0];
 35         }
 36         
 37         // 判断是否四个方向都会被将军,或者无路可走的方向也认为是被将军
 38         int cnt = 0;
 39         for (int i = 0; i < 4; i++)
 40             cnt += check(bX + dx[i], bY + dy[i]);
 41         
 42         if (cnt < 4) puts("NO");
 43         else puts("YES");
 44         
 45     }
 46     
 47 }
 48 
 49 int check(int r, int c) {
 50     
 51     // 越界,无路可走
 52     if (r < 1 || r > 3 || c < 4 || c > 6) return 1;
 53     
 54     
 55     // 因为我们没法保证车中间有没有其他棋子,所以必须从近到远一格格检查
 56     // 车在同行且中间无棋子
 57     for (int j = c - 1; j > 0; j--) {
 58         if (brd[r][j])
 59             if (‘R‘ == brd[r][j]) return 1;
 60             else break;
 61     }
 62     
 63     for (int j = c + 1; j <= 9; j++) {
 64         
 65         if (brd[r][j])
 66             if (‘R‘ == brd[r][j]) return 1;
 67             else break;
 68     }
 69     
 70     
 71     // 车在同列且中间物棋子
 72     for (int j = r - 1; j > 0; j--) {
 73         
 74         if (brd[j][c])
 75             if (‘R‘ == brd[j][c]) return 1;
 76             else break;
 77         
 78     }
 79     
 80     for (int j = r + 1; j <=10; j++) {
 81         
 82         if (brd[j][c])
 83             if (‘R‘ == brd[j][c] || ‘G‘ == brd[j][c]) return 1;
 84             else break;
 85         
 86     }
 87     
 88     // 炮将军
 89     for (int k = 0; k < 2; k++) {
 90         
 91         // 行有炮
 92         if (r == cr[k]) {
 93             int cnt = 0;
 94             for (int j = c - 1; j > cc[k]; j--) if (brd[r][j]) ++cnt;
 95             if (cnt == 1) return 1;
 96             cnt = 0;
 97             for (int j = c + 1; j < cc[k]; j++) if (brd[r][j]) ++cnt;
 98             if (cnt == 1) return 1;
 99             
100         }
101         
102         // 列有跑
103         if (c == cc[k]) {
104             int cnt = 0;
105             for (int j = r - 1; j > cr[k]; j--) if (brd[j][c]) ++cnt;
106             if (cnt == 1) return 1;
107             cnt = 0;
108             for (int j = r + 1; j < cr[k]; j++) if (brd[j][c]) ++cnt;
109             if (cnt == 1) return 1;
110         }
111         
112         
113     }
114     
115     // 马将军,马的8个方位
116     for(int k = 0; k < 8; ++k) {
117         
118         int tr = r + hx[k], tc = c + hy[k];
119         if (tr < 1 || tr > 10 || tc < 1 || tc > 9) continue;
120         if (brd[tr][tc] == ‘H‘ && (!brd[r + tx[k]][c + ty[k]]))
121             return 1;
122         
123     }
124     return 0;
125 }

时间: 2024-10-14 13:07:10

uva 1589 by sixleaves的相关文章

UVA 1589 Xiangqi

Z1589 - Xiangqi Time limit: 3.000 seconds 做这题的时候WA了很多次. 解决思路是,枚举黑方将军可以移动的位置,接着判断这些位置是否被红方将军,如果所有位置会被红方吃掉,那么就是checkmate了. 要注意的情况可能就是双炮将军. 1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 char board[12][12]; 6 int dr[4] = { 1,

UVA 1589 象棋

题意: 给出一个黑方的将, 然后 红方有 2 ~ 7 个棋子, 给出摆放位置,问是否已经把黑将将死, 红方已经将军. 分析: 分情况处理, 车 马 炮, 红将情况跟车是一样的. 建一个数组board保存棋局, 然后建一个数组moveable用来算出黑将当前位置能走的格子(1可走, 0不可走, 一开始都是1), 判断一下黑将上下左右四个方位是否能走, 而且走了之后算一下当前位置moveable是否0即可. 代码: 1 #include <bits/stdc++.h> 2 using namesp

UVA 1589:Xiangqi (模拟 Grade D)

题目: 象棋,黑棋只有将,红棋有帅车马炮.问是否死将. 思路: 对方将四个方向走一步,看看会不会被吃. 代码: 很难看……WA了很多发,还越界等等. #include <cstdio> #include <cstring> #include <cstdlib> char graph[13][13]; int go[4][2] = {{1,0},{0,1},{-1,0},{0,-1}}; bool inBlackPalace(int x, int y) { return

UVA - 1589 Xiangqi (模拟)

Xiangqi Problem Description Xiangqi is one of the most popular two-player board games in China. The game represents a battle between two armies with the goal of capturing the enemy's "general" piece. In this problem, you are given a situation of

uva 101 by sixleaves

这是一道很好的模拟题,用vector<int> p[maxn],建立模型,映射为maxn个堆.主要要掌握vector模拟堆操作的简单方法.接下来得思路是自顶向下的方式,逐步完善程序.首先根据提议列出下表.1.move a onto bclear_above(a) && clear_above(b);insert a above b; 2.move a over bclear(a)insert a above bs 3.pile a onto bclear(b)insert as

UVA 1589 Xiangqi(仔细的模拟)

题意:中国象棋大家都玩过,就是基本规则,只有将,帅,车,马,炮. 解题思路: 思路是把各个棋子能攻击到的位置在judge数组相应的位置上标记出来 首先考虑马蹩马腿的情况,这个比较好考虑,注意不要越界就行了. 车,不能穿过自己方的车,马,炮,帅.但范围可以穿过'将',因为'将'下一步会移动. 炮,不可以用'将'作为炮架,其余都可以,因为'将'下一步会移动. 帅,情况很简单.一条线. 要注意的是,每个棋子的攻击范围,是必须到另一个棋子的位置的 考虑数据 3 1 5 R 1 1 R 2 5 G10 5

UVa 1589 Xiangqi(模拟 HDU4121)

题意  给你一个黑方被将军的象棋残局  判断红方是否已经把黑方将死 模拟题  注意细节就行了  看黑方的将是否四个方向都不能走 #include<cstdio> #include<cstring> using namespace std; const int N = 12; char brd[N][N]; int dx[] = { -1, 1, 0, 0}, dy[] = {0, 0, -1, 1}; int hx[] = { -2, -1, -2, -1, 1, 2, 1, 2}

Xiangqi UVA - 1589

https://vjudge.net/problem/UVA-1589 刘汝佳的第四章习题,思路没有难点,是用来练习函数化和自定而下的编程方法的. 首先分析输入输出,思考用什么容器存储数据,处理问题时会用到什么,然后写出大体框架. 可以简单的先写成接收输入,处理问题,按标准要求输出,然后把输入输出部分完善(因为本题这部分比较简单) 然后写处理部分,要判断当前情况下将死等于判断下一步所有能走的位置是不是都为死棋.(有一种特殊情况,直接可以飞将吃对方的帅来取胜?!!!) 再细化问题,把判断该位置是不

【UVA】1589 Xiangqi(挖坑待填)

题目 题目 ? ? 分析 无力了,noip考完心力憔悴,想随便切道题却码了250line,而且还是错的,知道自己哪里错了,但特殊情况判起来太烦了,唯一选择是重构,我却没有这勇气. 有空再写吧,最近真的快疯了. ? ? 代码 对拍 #include <bits/stdc++.h> int main() { for(int i=1;i<=100;i++){ system("rand.exe > in.txt"); system("1589.exe <