UVA 1589:Xiangqi (模拟 Grade D)
2024-10-19 06:16:20
题目:
象棋,黑棋只有将,红棋有帅车马炮。问是否死将。
思路:
对方将四个方向走一步,看看会不会被吃。
代码:
很难看……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 ;
}
最新文章
- WinForm 代码实现以管理员身份运行
- 【Python】django多对多 查询 ,反查等操作
- Oracle存储过程java 调用
- unity工程接入Android sdk后真机测试解锁屏后退出的解决
- Android+struts2+JSON方式的手机开发(Login)
- mxml日期显示使用
- js手写图片查看器(图片的缩放、旋转、拖拽)
- Web 前端代码规范
- Spring两种代理区别
- 在 Arch 下编译 OpenWRT cmcurl 问题与解决方案
- mysql 安装 linux系统下
- Object的所有方法
- [UnityShader基础]06.#pragma multi_compile
- php 守护进程(Daemon)
- CentOS随笔——关机命令
- npm run dev 在Linux上持久运行
- Java IO(四)——字符流
- redis4.X
- C# Task的GetAwaiter和ConfigureAwait
- MYSQL中动态行数据转列数据