UVA 1589 象棋

题意:

给出一个黑方的将, 然后 红方有 2 ~ 7 个棋子, 给出摆放位置,问是否已经把黑将将死, 红方已经将军。

分析:

分情况处理, 车 马 炮, 红将情况跟车是一样的。

建一个数组board保存棋局, 然后建一个数组moveable用来算出黑将当前位置能走的格子(1可走, 0不可走, 一开始都是1), 判断一下黑将上下左右四个方位是否能走, 而且走了之后算一下当前位置moveable是否0即可。

代码:

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 int N, bx, by;
  4 int board[11][10];
  5 int tboard[11][10];
  6 int movable[11][10];
  7 struct CHESS
  8 {
  9     char name;
 10     int x, y;
 11 }chess[10];
 12 void Chariot(int x, int y){
 13     for(int i = x - 1; i >= 1; i--){
 14         movable[i][y] = 0;
 15         if(tboard[i][y] && tboard[i][y] != ‘B‘)
 16             break;
 17     }
 18     for(int i = x + 1; i <= 10; i++){
 19         movable[i][y] = 0;
 20         if(tboard[i][y] && tboard[i][y] != ‘B‘)
 21             break;
 22     }
 23     for(int i = y + 1; i <= 9; i++){
 24         movable[x][i] = 0;
 25         if(tboard[x][i] && tboard[x][i] != ‘B‘)
 26             break;
 27     }
 28     for(int i = y - 1; i >= 1; i --){
 29         movable[x][i] = 0;
 30         if(tboard[x][i] && tboard[x][i] != ‘B‘)
 31             break;
 32     }
 33 }
 34 void Cannon(int x, int y)
 35 {
 36     for(int i = x - 1; i >= 1; i --){
 37         if(tboard[i][y] && tboard[i][y] != ‘B‘){
 38             for(int j = i - 1; j >= 1; j--){
 39                 movable[j][y] = 0;
 40                 if(tboard[j][y] && tboard[j][y] != ‘B‘)
 41                     break;
 42             }
 43             break;
 44         }
 45     }
 46     for(int i = x + 1; i <= 10 ; i++){
 47           if(tboard[i][y] && tboard[i][y] != ‘B‘){
 48             for(int j = i+1; j <= 10; j++){
 49                 movable[j][y] = 0;
 50                 if(tboard[j][y] && tboard[j][y] != ‘B‘)
 51                     break;
 52             }
 53             break;
 54         }
 55     }
 56     for(int i = y - 1; i >= 1; i--){
 57         if(tboard[x][i] && tboard[x][i] != ‘B‘){
 58             for(int j = i - 1; j >= 1; j--){
 59                 movable[x][j] = 0;
 60                 if(tboard[x][j] && tboard[j][y] != ‘B‘)
 61                     break;
 62             }
 63             break;
 64         }
 65     }
 66
 67      for(int i = y + 1; i <= 9; i++){
 68         if(tboard[x][i] && tboard[x][i] != ‘B‘){
 69             for(int j = i + 1; j <= 9; j++){
 70                 movable[x][j] = 0;
 71                 if(tboard[x][j] && tboard[j][y] != ‘B‘)
 72                     break;
 73             }
 74             break;
 75         }
 76     }
 77
 78 }
 79 int dir[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};//上右下左
 80 int dir2[8][2] = {{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};
 81 void Horse(int x, int y)
 82 {
 83     for(int i = 0; i < 4; i++){
 84         int tx = x, ty = y;
 85         tx += dir[i][0];
 86         ty += dir[i][1];
 87         if(tx >= 1 && ty >= 1 && tx <= 10 && ty <= 9);
 88         else continue;
 89         if(tboard[tx][ty]) continue;
 90         tx = x; ty = y;
 91         tx += dir2[(i+1)*2 - 2][0];
 92         ty += dir2[(i+1)*2 - 2][1];
 93         if(tx >= 1 && ty >= 1 && tx <= 10 && ty <= 9)
 94             movable[tx][ty] = 0;
 95         tx = x; ty = y;
 96         tx += dir2[(i+1)*2 - 1][0];
 97         ty += dir2[(i+1)*2 - 1][1];
 98         if(tx >= 1 && ty >= 1 && tx <= 10 && ty <= 9)
 99             movable[tx][ty] = 0;
100     }
101 }
102 int main()
103 {
104
105     while(scanf("%d %d %d", &N, &bx, &by) != EOF){
106         if(N == 0) break;
107         memset(board, 0, sizeof(board));
108         board[bx][by] = ‘B‘;
109         for(int i = 1; i <= 10; i++){
110             for(int j = 1; j<= 9; j++){
111                 movable[i][j] = 1;
112             }
113         }
114
115         for(int i = 0; i < N; i++){
116             int x, y;
117             char name;
118             scanf(" %c", &name);
119             scanf("%d %d", &x, &y);
120             board[x][y] = name;
121         }
122         int ok = 0;
123         for(int i = 0; i < 4; i++)
124         {
125             int tx = bx, ty = by;
126             tx += dir[i][0];
127             ty += dir[i][1];
128             if(tx >= 1 && tx <= 3 && ty >= 4 && ty <= 6);
129             else continue;
130             for(int k = 1; k <= 10; k++){
131                 for(int j = 1; j <= 10; j++){
132                     tboard[k][j] = board[k][j];
133                 }
134             }
135             tboard[tx][ty] = ‘B‘;
136
137             for(int k = 1; k <= 10; k++){
138                 for(int j = 1; j<= 9; j++){
139                     movable[k][j] = 1;
140                 }
141             }
142
143             for(int k = 1; k <= 10; k++){
144                 for(int j = 1; j <= 9; j++){
145                     switch(tboard[k][j]){
146                         case ‘G‘:
147                             Chariot(k,j);
148                             break;
149                         case ‘R‘:
150                             Chariot(k,j);
151                             break;
152                         case ‘H‘:
153                             Horse(k,j);
154                             break;
155                         case ‘C‘:
156                             Cannon(k,j);
157                             break;
158                     }
159                 }
160             }
161
162             if(movable[tx][ty])
163                 ok = 1;
164         }
165         printf("%s\n", ok ? "NO":"YES");
166
167     }
168     return 0;
169 }
时间: 2024-11-05 23:20:15

UVA 1589 象棋的相关文章

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(仔细的模拟)

题意:中国象棋大家都玩过,就是基本规则,只有将,帅,车,马,炮. 解题思路: 思路是把各个棋子能攻击到的位置在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}

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 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 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};

1589象棋(大模拟)

题意:黑棋只有一个“将”,红棋有“马”,“炮”,“车”,“帅”中的几种,问黑棋是否没有被红棋将军. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> #define repu(i,a,b) for(int i=a;i<b;i++) #define mem(a) memset(a,0,sizeof(a

Xiangqi UVA - 1589

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

UVA 439 Knight Moves 走象棋 (DFS or BFS)

[题目链接]click here~~ [题目大意]类型于中国象棋里面"马"的走法,给你两个坐标,一个初始坐标,一个最终坐标,在保证有解的情况下最小的步数 [思路]BFS的话,直接模拟,因为棋盘比较小 (1)BFS +队列 代码:(3ms) #include <bits/stdc++.h> using namespace std; int dir8[8][2]= {{1,2},{2,1},{-1,2},{-2,1},{1,-2},{2,-1},{-1,-2},{-2,-1}}