UVA - 1589 Xiangqi (象棋)
2015-11-21 01:43
302 查看
题目链接:UVA - 1589 Xiangqi
题目大意:
给定一个象棋残局,黑方只有一个将,红方有帅以及3种可能棋子(车马炮),当前局面合法并保证红方已将军,问是否可以将黑方将死?
思路:
很简单的一道题,可以对黑将可走的地方进行判断,判断红方是否可以攻击到。或者标记红方所有子可以攻击的点,然后判断黑将可走的坐标中有没有没被标记的。
思路简单,写的过程wrong了好多次,因为好多小细节,纪录于下:
1:越界问题
2:残局初始状态下,将帅若见面,帅死,即不能将黑方将死。
3:马的绊蹄问题(玩过象棋都应该知道的)
4:黑将走一步可能会将红子吃掉。
代码如下:
题目大意:
给定一个象棋残局,黑方只有一个将,红方有帅以及3种可能棋子(车马炮),当前局面合法并保证红方已将军,问是否可以将黑方将死?
思路:
很简单的一道题,可以对黑将可走的地方进行判断,判断红方是否可以攻击到。或者标记红方所有子可以攻击的点,然后判断黑将可走的坐标中有没有没被标记的。
思路简单,写的过程wrong了好多次,因为好多小细节,纪录于下:
1:越界问题
2:残局初始状态下,将帅若见面,帅死,即不能将黑方将死。
3:马的绊蹄问题(玩过象棋都应该知道的)
4:黑将走一步可能会将红子吃掉。
代码如下:
[code]#include <stdio.h> #include <iostream> #include <vector> #include <math.h> #include <algorithm> #include <queue> #include <string.h> #include <set> #include <stack> #include <stdlib.h> #include <time.h> using namespace std; //grhc int dx[] = {-1,0,0,1}; int dy[] = {0,1,-1,0}; int tx[20]; int ty[20]; int f[20][20] = {}; bool ischeck(int x, int y, int n) { for(int i=0;i<n;i++) { if(tx[i] == x && ty[i] == y) continue; if(f[tx[i]][ty[i]] == 'G' || f[tx[i]][ty[i]] == 'R') { if(x == tx[i]) { int num = 0; for(int j = min(y, ty[i])+1;j<max(y, ty[i]);j++) { if(f[x][j] != 0) ++num; } if(num == 0) return true; } if(y == ty[i]) { int num = 0; for(int j = min(x, tx[i])+1;j<max(x, tx[i]);j++) { if(f[j][y] != 0) ++num; } if(num == 0) return true; } } if(f[tx[i]][ty[i]] == 'C') { if(x == tx[i]) { int num = 0; for(int j = min(y, ty[i])+1;j<max(y, ty[i]);j++) { if(f[x][j] != 0) ++num; } if(num == 1) return true; } if(y == ty[i]) { int num = 0; for(int j = min(x, tx[i])+1;j<max(x, tx[i]);j++) { if(f[j][y] != 0) ++num; } if(num == 1) return true; } } if(f[tx[i]][ty[i]] == 'H') { if(abs(tx[i]-x) == 2 && abs(ty[i]-y) == 1) { if(tx[i] > x && f[tx[i]-1][ty[i]] == 0) return true; if(tx[i] < x && f[tx[i]+1][ty[i]] == 0) return true; } if(abs(tx[i]-x) == 1 && abs(ty[i]-y) == 2) { if(ty[i] > y && f[tx[i]][ty[i]-1] == 0) return true; if(ty[i] < y && f[tx[i]][ty[i]+1] == 0) return true; } } } return false; } int main() { int n,x,y; while(cin>>n>>x>>y) { if(!n && !x && !y) break; memset(f, 0, sizeof(f)); int bx=0, by=0; for(int i=0;i<n;i++) { char ch; int a,b; cin>>ch>>a>>b; tx[i] = a; ty[i] = b; f[a][b] = ch; //cout<<"saa"<<f[a][b]<<endl; if(ch == 'G') { bx = a; by = b; } } bool ff = false; if(y == by) { ff = true; int l = min(bx, x) + 1; int r = max(bx, x); while(l < r) { if(f[l][y] != 0) { ff = false; break; } ++l; } } if(ff) { cout<<"NO"<<endl; continue; } int i; for(i=0;i<4;i++) { if(x+dx[i]>=1 && x+dx[i]<=3 && y+dy[i]>=4 && y+dy[i]<=6) { //cout<<x+dx[i]<<" "<<y+dy[i]<<endl; if(!ischeck(x+dx[i], y+dy[i], n)) break; } } if(i == 4) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
相关文章推荐
- 【郝斌数据结构自学笔记】27-29_链表插入和删除算法的演示_复习
- Linux Ubuntu mysql 乱码
- 数据库保存经纬度,需要采用什么数据类型,小数点应该精确多少位?
- ContentProvider 基础
- Android基本知识(二)
- UIImageView的contentMode属性
- Android VideoView简单播放视频
- LinearLayout 内部控件居中
- 【郝斌数据结构自学笔记】26_通过链表排序算法的演示再次详细讨论到底什么是算法以及到底什么是泛型【重点】
- php后台“爬虫”模拟登录第三方系统(三)---模拟登录学校正方系统
- BZOJ4327 : JSOI2012 玄武密码
- IOS学习之视图
- JAVA类的继承,封装,多态,以及接口的一些信息
- 【郝斌数据结构自学笔记】25_判断链表是否为空和求链表长度算法的演示
- 新闻发布系统
- 算法—归并排序改良后亿级秒排及排序算法的极致
- fedora21升级到22
- LightOJ - 1188 Fast Queries(离线树状数组)
- fedora21管理用户
- Android与服务器通信简单示例