UVA 1589:Xiangqi (模拟 Grade D)
题目:
象棋,黑棋只有将,红棋有帅车马炮。问是否死将。
思路:
对方将四个方向走一步,看看会不会被吃。
代码:
很难看……WA了很多发,还越界等等。
#include <cstdio>
#include <cstring>
#include <cstdlib> char graph[][];
int go[][] = {{,},{,},{-,},{,-}}; bool inBlackPalace(int x, int y) {
return <= y && y <= && <= x && x <= ;
} bool inChess(int x, int y) {
return <= x && x <= && <= y && y <= ;
} bool goG(int x, int y) {
for (int i = x-; i >= ; i--) {
if (graph[i][y]) {
return graph[i][y] == 'B';
}
}
return false;
} bool goR(int x, int y) {
for (int i = x-; i >= ; i--) {
if (graph[i][y]) {
if (graph[i][y] == 'B') return true;
break;
}
}
for (int i = x+; i <= ; i++) {
if (graph[i][y]) {
if (graph[i][y] == 'B') return true;
break;
}
}
for (int j = y-; j >= ; j--) {
if (graph[x][j]) {
if (graph[x][j] == 'B') return true;
break;
}
}
for (int j = y+; j <= ; j++) {
if (graph[x][j]) {
if (graph[x][j] == 'B') return true;
break;
}
}
return false;
} int can_move(int x,int y,int w)
{
if(w==) if(x<||x>||y<||y>) return ;
if(w==) if(x<||x>||y<||y>) return ;
return ;
} bool goH(int x, int y) {
for (int i = ; i < ; i++) {
int nx = x + go[i][];
int ny = y + go[i][];
if ( <= nx && nx <= && <= ny && ny <= ) {
if (graph[nx][ny] == ) {
if (inChess(nx+go[i][]+go[i][],ny+go[i][]+go[i][]))
if (graph[nx+go[i][]+go[i][]][ny+go[i][]+go[i][]] == 'B') return true; if (inChess(nx+go[i][]-go[i][],ny+go[i][]-go[i][]))
if (graph[nx+go[i][]-go[i][]][ny+go[i][]-go[i][]] == 'B') return true;
}
}
}
return false;
} bool goC(int x, int y) {
bool first = true;
for (int i = x-; i >= ; i--) {
if (graph[i][y]) {
if (first) {
first = false;
} else {
if (graph[i][y] == 'B') return true;
break;
}
}
}
first = true;
for (int i = x+; i <= ; i++) {
if (graph[i][y]) {
if (first) {
first = false;
} else {
if (graph[i][y] == 'B') return true;
break;
}
}
} first = true;
for (int j = y-; j >= ; j--) {
if (graph[x][j]) {
if (first) {
first = false;
} else {
if (graph[x][j] == 'B') return true;
break;
}
}
}
first = true;
for (int j = y+; j <= ; j++) {
if (graph[x][j]) {
if (first) {
first = false;
} else {
if (graph[x][j] == 'B') return true;
break;
}
}
}
return false;
} bool goo(int x, int y) {
switch(graph[x][y]) {
case 'G': return goG(x,y);
case 'R': return goR(x,y);
case 'H': return goH(x,y);
case 'C': return goC(x,y);
} return false;
} char ch[];
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int bx, by;
scanf("%d%d", &bx, &by);
if (n == && bx == && by == ) break; memset(graph, , sizeof(graph)); for (int i = ; i < n; i++) {
int x, y;
scanf("%s%d%d", ch, &x, &y);
graph[x][y] = ch[];
} bool flag = false;
for (int way = ; way < ; way++) {
int nx = bx + go[way][];
int ny = by + go[way][];
if (!inBlackPalace(nx, ny)) continue;
char tmp = graph[nx][ny];
graph[nx][ny] = 'B';
bool ok = true;
for (int i = ; i <= && ok; i++) {
for (int j = ; j <= && ok; j++) {
if (graph[i][j]) {
if (goo(i,j)) ok = false;
}
}
} graph[nx][ny] = tmp;
if (ok) {
flag = true;
break;
}
} puts(flag?"NO":"YES");
}
return ;
}
UVA 1589:Xiangqi (模拟 Grade D)的更多相关文章
- ●UVa 1589 Xiangqi(模拟)
●赘述题意 给出一个中国象棋残局,告诉各个棋子的位置,黑方只有1枚“将”,红方有至少2枚,至多7枚棋子,包含1枚“帅G”,和若干枚“车R”,“马H”,“炮C”.当前为黑方的回合,问黑方的“将”能否在移 ...
- 【每日一题】 UVA - 1589 Xiangqi 函数+模拟 wa了两天
题意:背景就是象棋, 题解:坑点1(wa的第一天):将军可以吃掉相邻的棋子,(然行列也写反了orz) 坑点2(wa的第二天):将军到马要反过来写,边界有误,并且第一次碰到的车才算(写到后来都忘了) # ...
- Uva - 1589 - Xiangqi
Xiangqi is one of the most popular two-player board games in China. The game represents a battle bet ...
- 【UVA】1589 Xiangqi(挖坑待填)
题目 题目 分析 无力了,noip考完心力憔悴,想随便切道题却码了250line,而且还是错的,知道自己哪里错了,但特殊情况判起来太烦了,唯一选择是重构,我却没有这勇气. 有空再写吧,最近真的 ...
- UVA 1594:Ducci Sequence (模拟 Grade E)
题意: 对于一个n元组(a0,a1,...),一次变换后变成(|a0-a1|,|a1-a2|,...) 问1000次变换以内是否存在循环. 思路: 模拟,map判重 代码: #include < ...
- UVA 1593: Alignment of Code(模拟 Grade D)
题意: 格式化代码.每个单词对齐,至少隔开一个空格. 思路: 模拟.求出每个单词最大长度,然后按行输出. 代码: #include <cstdio> #include <cstdli ...
- uva 177:Paper Folding(模拟 Grade D)
题目链接 题意:一张纸,每次从右往左对折.折好以后打开,让每个折痕都自然的呈90度.输出形状. 思路:模拟折……每次折想象成把一张纸分成了正面在下的一张和反面在上的一张.维护左边和方向,然后输出.细节 ...
- HDU 4121 Xiangqi 模拟题
Xiangqi Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4121 ...
- UVA 246 - 10-20-30 (模拟+STL)
UVA 246 - 10-20-30 题目链接 题意:给52张的扑克堆,先从左往右发7张牌,之后连续不断从左往右发7张牌,假设有牌堆形成了下面3种情况(按顺序推断): 1.头两张+尾一张和为10或20 ...
随机推荐
- python面向对象三大特性
面向对象的三大特性: 封装.继承和多态 一.封装 封装,顾名思义就是将内容封装到某个地方,以后可以直接调用被封装到某处的内容. - 将内容封装到某处 - 从某处调用被封装的内容 第一步,将内容封装到某 ...
- 12,nginx+uWSGI+django+virtualenv+supervisor发布web服务器
导论 WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求) 基于wsgi运行的框架 ...
- 起始授权机构(SOA)
起始授权机构 编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 起始授权机构,SOA(Start Of Authority):该记录表明DNS名称服务器是DNS域中的数据 ...
- 《算法》C++代码 Floyd
今天写写最短路径的Floyd算法(有翻译叫弗洛伊德,不过这奇葩翻译用来读读就好……). 这个算法的实质,广义来讲,其实是DP(动态规划).其实按说,算法应该先说说什么贪心.搜索.DP.二分之类的基本算 ...
- selenium获取浏览器控制台日志
public void logsTest(){ WebDriver driver = null; try { System.setProperty("webdriver.chrome.dri ...
- Restful API实战
简介:随着移动互联网的发展,客户端层出不穷,app,web,微信端等等,而后端业务逻辑基于是一致的,如何做到业务逻辑“一次编写,随时接入”?答案是通过远程调用API,而目前比较火的方案是“Restfu ...
- golang中从一个日期开始往后增加一段时间
废话少说上code, 这个是从当前日期开始,往后增加一个月时间 package main import ( "fmt" "time" ) func main() ...
- 第十章 用户数据报协议和IP分片
用户数据报协议和IP分片 UDP是一种保留消息边界的简单的面向数据报的传输层协议.它仅提供差错检测.只是检测,而不是纠正,它只是把应用程序传给IP层的数据发送出去,但是并不会保证数据能够完好无损的到达 ...
- 第五章 Internet协议
写在开头: 埋头学习也差不多半个月了,达到了这半个月每天都会去图书馆的目标.确实挺忙的,不管在学习上,部门社团上,党建上.有时候为了多学一些总是会挤掉了其他事情的一些时间.但是自己时刻提醒着自己不要太 ...
- struct&&class 空的大小
#include using namespace std; class ClassA { }; class ClassB { private: int b; }; class ClassC : pub ...