UVA 1589 象棋
题意:
给出一个黑方的将, 然后 红方有 2 ~ 7 个棋子, 给出摆放位置,问是否已经把黑将将死, 红方已经将军。
分析:
分情况处理, 车 马 炮, 红将情况跟车是一样的。
建一个数组board保存棋局, 然后建一个数组moveable用来算出黑将当前位置能走的格子(1可走, 0不可走, 一开始都是1), 判断一下黑将上下左右四个方位是否能走, 而且走了之后算一下当前位置moveable是否0即可。
代码:
#include <bits/stdc++.h>
using namespace std;
int N, bx, by;
int board[][];
int tboard[][];
int movable[][];
struct CHESS
{
char name;
int x, y;
}chess[];
void Chariot(int x, int y){
for(int i = x - ; i >= ; i--){
movable[i][y] = ;
if(tboard[i][y] && tboard[i][y] != 'B')
break;
}
for(int i = x + ; i <= ; i++){
movable[i][y] = ;
if(tboard[i][y] && tboard[i][y] != 'B')
break;
}
for(int i = y + ; i <= ; i++){
movable[x][i] = ;
if(tboard[x][i] && tboard[x][i] != 'B')
break;
}
for(int i = y - ; i >= ; i --){
movable[x][i] = ;
if(tboard[x][i] && tboard[x][i] != 'B')
break;
}
}
void Cannon(int x, int y)
{
for(int i = x - ; i >= ; i --){
if(tboard[i][y] && tboard[i][y] != 'B'){
for(int j = i - ; j >= ; j--){
movable[j][y] = ;
if(tboard[j][y] && tboard[j][y] != 'B')
break;
}
break;
}
}
for(int i = x + ; i <= ; i++){
if(tboard[i][y] && tboard[i][y] != 'B'){
for(int j = i+; j <= ; j++){
movable[j][y] = ;
if(tboard[j][y] && tboard[j][y] != 'B')
break;
}
break;
}
}
for(int i = y - ; i >= ; i--){
if(tboard[x][i] && tboard[x][i] != 'B'){
for(int j = i - ; j >= ; j--){
movable[x][j] = ;
if(tboard[x][j] && tboard[j][y] != 'B')
break;
}
break;
}
} for(int i = y + ; i <= ; i++){
if(tboard[x][i] && tboard[x][i] != 'B'){
for(int j = i + ; j <= ; j++){
movable[x][j] = ;
if(tboard[x][j] && tboard[j][y] != 'B')
break;
}
break;
}
} }
int dir[][] = {{-,},{,},{,},{,-}};//上右下左
int dir2[][] = {{-,-},{-,},{-,},{,},{,},{,-},{,-},{-,-}};
void Horse(int x, int y)
{
for(int i = ; i < ; i++){
int tx = x, ty = y;
tx += dir[i][];
ty += dir[i][];
if(tx >= && ty >= && tx <= && ty <= );
else continue;
if(tboard[tx][ty]) continue;
tx = x; ty = y;
tx += dir2[(i+)* - ][];
ty += dir2[(i+)* - ][];
if(tx >= && ty >= && tx <= && ty <= )
movable[tx][ty] = ;
tx = x; ty = y;
tx += dir2[(i+)* - ][];
ty += dir2[(i+)* - ][];
if(tx >= && ty >= && tx <= && ty <= )
movable[tx][ty] = ;
}
}
int main()
{ while(scanf("%d %d %d", &N, &bx, &by) != EOF){
if(N == ) break;
memset(board, , sizeof(board));
board[bx][by] = 'B';
for(int i = ; i <= ; i++){
for(int j = ; j<= ; j++){
movable[i][j] = ;
}
} for(int i = ; i < N; i++){
int x, y;
char name;
scanf(" %c", &name);
scanf("%d %d", &x, &y);
board[x][y] = name;
}
int ok = ;
for(int i = ; i < ; i++)
{
int tx = bx, ty = by;
tx += dir[i][];
ty += dir[i][];
if(tx >= && tx <= && ty >= && ty <= );
else continue;
for(int k = ; k <= ; k++){
for(int j = ; j <= ; j++){
tboard[k][j] = board[k][j];
}
}
tboard[tx][ty] = 'B'; for(int k = ; k <= ; k++){
for(int j = ; j<= ; j++){
movable[k][j] = ;
}
} for(int k = ; k <= ; k++){
for(int j = ; j <= ; j++){
switch(tboard[k][j]){
case 'G':
Chariot(k,j);
break;
case 'R':
Chariot(k,j);
break;
case 'H':
Horse(k,j);
break;
case 'C':
Cannon(k,j);
break;
}
}
} if(movable[tx][ty])
ok = ;
}
printf("%s\n", ok ? "NO":"YES"); }
return ;
}
UVA 1589 象棋的更多相关文章
- ●UVa 1589 Xiangqi(模拟)
●赘述题意 给出一个中国象棋残局,告诉各个棋子的位置,黑方只有1枚“将”,红方有至少2枚,至多7枚棋子,包含1枚“帅G”,和若干枚“车R”,“马H”,“炮C”.当前为黑方的回合,问黑方的“将”能否在移 ...
- 【每日一题】 UVA - 1589 Xiangqi 函数+模拟 wa了两天
题意:背景就是象棋, 题解:坑点1(wa的第一天):将军可以吃掉相邻的棋子,(然行列也写反了orz) 坑点2(wa的第二天):将军到马要反过来写,边界有误,并且第一次碰到的车才算(写到后来都忘了) # ...
- UVA 1589:Xiangqi (模拟 Grade D)
题目: 象棋,黑棋只有将,红棋有帅车马炮.问是否死将. 思路: 对方将四个方向走一步,看看会不会被吃. 代码: 很难看……WA了很多发,还越界等等. #include <cstdio> # ...
- uva 1589 by sixleaves
坑爹的模拟题目.自己对于这种比较复杂点得模拟题的能力概述还不够,还多加练习.贴别是做得时候一直再想如何检查车中间有没有棋子,炮中间有没有棋子.到网上参考别人的代码才发先这么简单的办法,自己尽然想不到. ...
- Uva - 1589 - Xiangqi
Xiangqi is one of the most popular two-player board games in China. The game represents a battle bet ...
- UVa 11538 象棋中的皇后
https://vjudge.net/problem/UVA-11538 题意: n×m的棋盘,有多少种方法放置两个相互攻击的皇后? 思路: 这两个皇后互相攻击的方式只有3种,在同一行,在同一列,或在 ...
- dir命令只显示文件名
dir /b 就是ls -f的效果 1057 -- FILE MAPPING_web_archive.7z 2007 多校模拟 - Google Search_web_archive.7z 2083 ...
- 【UVA】1589 Xiangqi(挖坑待填)
题目 题目 分析 无力了,noip考完心力憔悴,想随便切道题却码了250line,而且还是错的,知道自己哪里错了,但特殊情况判起来太烦了,唯一选择是重构,我却没有这勇气. 有空再写吧,最近真的 ...
- UVA 439 Knight Moves(BFS)
Knight Moves option=com_onlinejudge&Itemid=8&category=11&page=show_problem&problem=3 ...
随机推荐
- jquery中document.ready在两类浏览器中的区别[转]
DOMready的构建方法不再重复,现代浏览器通过DOMContentLoaded来实现,IE通过readystatechange+doScroll来模拟该方法. 类似jquery中的document ...
- 进击的Python【第十三章】:Web前端基础之HTML与CSS样式
进击的Python[第十四章]:Web前端基础之HTML与CSS样式 一.web框架的本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客 ...
- 贪心+枚举/哈希表 HDOJ Trouble
题目传送门 题意:5个集合,每个集合最多200个数字,问是否每个集合挑一个数加起来和为0. 分析:显然n^5的程序果断超时,甚至n^3logn的二分也过不了.想n^3的方法,既然判断有没有,那么可以将 ...
- HTTP协议 之 缓存
转自: http://www.cnblogs.com/TankXiao/archive/2012/11/28/2793365.html HTTP协议提供了非常强大的缓存机制, 了解这些缓存机制,对提 ...
- 第二个Struts2程序 应用动态Action
1.创建web项目,添加struts2支持的类库,在web.xml中配置struts2过滤器. 2.创建名为UserAction的Action对象,并分别在其中编写add()和update()方法,用 ...
- Codeforces Round #179 (Div. 1)
A 直接线段树过的 两遍 貌似大多是标记过的..注意long long #include <iostream> #include <cstdio> #include <c ...
- webapp开发学习---Cordova目录结构分析及一些概念
Config.xml是一个全局配置文件,用于控制cordova应用程序行为的许多方面. 这个不依赖于平台的XML文件是基于W3C的“打包Web应用程序(Widget)”规范进行安排的,并扩展到指定 ...
- ie浏览器和火狐浏览器对对容器宽度定义的差异
首先我们说说firefox和IE对CSS的宽度显示有什么不同: 其实CSS ’width’ 指的是标准CSS中所指的width的宽度,在firefox中的宽度就是这个宽度.它只包含容器中内容的宽度.而 ...
- APP崩溃处理
以前经常遇到APP内部异常情况下的Exception,最初是通过try catch这样的方式处理:但是APP上线后,用户在特地的情况下触发 了某些Exception,当然这些Exception从理论和 ...
- spring 中文乱码问题
spring 开发过程中的中文乱码问题主要分为以下几种: 1.前端传参数到后台前 就已经乱码. 这个很大原因就是前端的问题了! 2.传入后台后,乱码. 可能存在几个原因: 2.1 传入tomcat前 ...