首页 > 代码库 > hdu 4121 xiangqi 模拟
hdu 4121 xiangqi 模拟
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4121
康复训练
小模拟
几个坑:
1.黑general可以通过飞过来吃掉红general来摆脱困境
2.可能需要注意某些棋子被黑general吃掉的情况
本质是搜索 这种题完全不可能卡时间
将、车、炮用一种判法
马另用一种判法
#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>#include <cmath>#include <set>#include <queue>#include <stack>#include <map>#include <vector>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair<int, int> P;int xx, yy;//敌军将帅原始位置int rcnt, ccnt, hcnt, gcnt;int r[10][2];int c[10][2];int h[10][2];int g[10][2];int board[12][11];int hboard[12][11];const int walk[4][2] = {1, 0, 0, 1, -1, 0, 0, -1};const int hwalk[8][2] = {2, 1, 1, 2, -1, 2, -2, 1, -1, -2, -2, -1, 1, -2, 2, -1};const int hcheck[4][2] = {1, 1, -1, 1, -1, -1, 1, -1};int lineCheck(int a, int b, int mode, int k){ int cnt = 0; if(a > b) swap(a, b); for(int i = a+1; i < b; i++) { if(mode == 0) { if(board[k][i] == 1) cnt++; } else if(mode == 1) { if(board[i][k] == 1) cnt++; } } return cnt;}bool check(int x, int y){ for(int i = 0; i < gcnt; i++) { if(g[i][1] == y) { if(lineCheck(x, g[i][0], 1, y) == 0) return true; } } for(int i = 0; i < rcnt; i++) { if(r[i][0] == x && !(r[i][0] == x && r[i][1] == y)) { if(lineCheck(r[i][1], y, 0, x) == 0) return true; } else if(r[i][1] == y && !(r[i][0] == x && r[i][1] == y)) { if(lineCheck(r[i][0], x, 1, y) == 0) return true; } } for(int i = 0; i < ccnt; i++) { if(c[i][0] == x && !(c[i][0] == x && c[i][1] == y)) { if(lineCheck(c[i][1], y, 0, x) == 1) return true; } else if(c[i][1] == y && !(c[i][0] == x && c[i][1] == y)) { if(lineCheck(c[i][0], x, 1, y) == 1) return true; } } for(int i = 0; i < 8; i++) { int a = x + hwalk[i][0]; int b = y + hwalk[i][1]; if(1 <= a && a <= 10 && 1 <= b && b <= 9) { if(hboard[a][b] == 1) { int aa = x + hcheck[i/2][0]; int bb = y + hcheck[i/2][1]; if(board[aa][bb] == 0)//判绊马脚 return true; } } } return false;}int main(){ //freopen("in.txt", "r", stdin); int n; char buf[10]; while(scanf("%d%d%d", &n, &xx, &yy) == 3 && n != 0) { memset(board, 0, sizeof(board)); memset(hboard, 0, sizeof(hboard)); rcnt = 0; ccnt = 0; hcnt = 0; gcnt = 0; int tmpx, tmpy; for(int i = 0; i < n; i++) { scanf("%s%d%d", buf, &tmpx, &tmpy); board[tmpx][tmpy] = 1; if(buf[0] == ‘G‘) { g[gcnt][0] = tmpx; g[gcnt][1] = tmpy; gcnt++; } else if(buf[0] == ‘R‘) { r[rcnt][0] = tmpx; r[rcnt][1] = tmpy; rcnt++; } else if(buf[0] == ‘C‘) { c[ccnt][0] = tmpx; c[ccnt][1] = tmpy; ccnt++; } else if(buf[0] == ‘H‘) { hboard[tmpx][tmpy] = 1; h[hcnt][0] = tmpx; h[hcnt][1] = tmpy; hcnt++; } } bool flag = true; if(yy == g[0][1]) { if(lineCheck(xx, g[0][0], 1, yy) == 0) { printf("NO\n"); continue; } } for(int i = 0; i < 4; i++) { int x = xx + walk[i][0]; int y = yy + walk[i][1]; if(1 <= x && x <= 3 && 4 <= y && y <= 6) { flag = check(x, y); } if(!flag) break; } if(flag) printf("YES\n"); else printf("NO\n"); } return 0;}
一开始写得急 边写边想
然后就搞得里面有很多代码块有重复 但却懒得去重构 心想过了就好
然后改来改去还是wa
最后试着把重复的代码块抽出来写了一个lineCheck函数就过了
模拟题还是不能懒
特别要注意如果有重复的代码块最好另起一个函数
一是只需要写一次 出错的机会小了
二是如果发现错了 也好改 就改一处 不会有什么改漏了改串了的情况
hdu 4121 xiangqi 模拟
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。